Flask Security这个插件能对用户权限进行很好的控制。

通过三个model实现:

User,存放用户数据

Role,存放角色数据

User_Role.存放用户角色信息

user_datastore = SQLAlchemyUserDatastore(db, User, Role)

通过user_datastore可以查找用户,角色,以及赋予或者删除用户角色等操作。具体参见:http://pythonhosted.org/Flask-Security/api.html

比如我们新建一个view:

  1. @app.route('/')
  2. @login_required
  3. def home():
  4. return render_template('index.html')

这个要求登陆,security会自动产生一个登陆页面, 当然你也可以覆盖自带的template

如果填写正确就可以看到内容。

那么如何使用权限控制呢。

  1. @app.route('/dashboard')
  2. @roles_required('admin', 'editor')
  3. def dashboard():
  4. return "dashboard"

这里使用了@roles_required()这个装饰器来实现,需要登陆的用户拥有admin和editor两个角色。另外一个相应的装饰器是@roles_accepted(),这个只要有其中一个角色就可以通过。

那么如果不满足条件,就会往其它地方跳转。

我们看看其源代码:

  1. def wrapper(fn):
  2. @wraps(fn)
  3. def decorated_view(*args, **kwargs):
  4. perms = [Permission(RoleNeed(role)) for role in roles]
  5. for perm in perms:
  6. if not perm.can():
  7. if _security._unauthorized_callback:
  8. return _security._unauthorized_callback()
  9. else:
  10. return _get_unauthorized_view()
  11. return fn(*args, **kwargs)
  12. return decorated_view
  13. return wrapper

看到如果没有通过权限认证,那么就会查看是否有_unauthorized_callback这个方法。如果有就调用

如果没有,那么就会调用_get_unauthorized_view()方法。

然后继续看其代码:

  1. def _get_unauthorized_view():
  2. cv = utils.get_url(utils.config_value('UNAUTHORIZED_VIEW'))
  3. utils.do_flash(*utils.get_message('UNAUTHORIZED'))
  4. return redirect(cv or request.referrer or '/')

可以看到其查找了'UNAUTHORIZED_VIEW'这个配置。

进入config_value,发现它调用了下面这个方法来查找配置:

  1. def get_config(app):
  2. """Conveniently get the security configuration for the specified
  3. application without the annoying 'SECURITY_' prefix.
  4. :param app: The application to inspect
  5. """
  6. items = app.config.items()
  7. prefix = 'SECURITY_'
  8. def strip_prefix(tup):
  9. return (tup[0].replace('SECURITY_', ''), tup[1])
  10. return dict([strip_prefix(i) for i in items if i[0].startswith(prefix)])

要注意到,我们在配置app的时候,要加一个‘SECURITY_’这个前缀才行!

所以只要我们在app中配置:

app.config['SECURITY_UNAUTHORIZED_VIEW'] = '/unauth'

然后添加一个视图:

  1. @app.route('/unauth')
  2. def unauth():
  3. return "unauth"

当认证失败后,就会跳转到这个页面了。

当然还有一个更灵活的配置方法,就是写一个装饰器,接受一个url

  1. def set_unauth_view(url):
  2. def wrapper(fn):
  3. def decorator(*args, **kwargs):
  4. current_app.config['SECURITY_UNAUTHORIZED_VIEW'] = url
  5. return fn(*args, **kwargs)
  6. return decorator
  7. return wrapper

然后:

  1. @app.route('/dashboard')
  2. @set_unauth_view('/unauth')
  3. @roles_required('admin', 'editor')
  4. def dashboard():
  5. return "dashboard"

这样就可以针对特定的view指定跳转的页面了。

[Flask Security]当不能通过认证的时候制定跳转的更多相关文章

  1. Spring Security(04)——认证简介

    目录 1.1     认证过程 1.2     Web应用的认证过程 1.2.1    ExceptionTranslationFilter 1.2.2    在request之间共享Security ...

  2. 基于Springboot集成security、oauth2实现认证鉴权、资源管理

    1.Oauth2简介 OAuth(开放授权)是一个开放标准,允许用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方移动应用或分享他们数据的所有内容,OAu ...

  3. Spring Security 之Http Basic认证

    使用Spring Security进行http Basic认证非常简单,直接配置即可使用,如下: <security:http> <security:http-basic>&l ...

  4. 登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

    登陆模块,这个是很重要的模块,有shiro和spring security专门的权限认证框架

  5. Spring Security 解析(三) —— 个性化认证 以及 RememberMe 实现

    Spring Security 解析(三) -- 个性化认证 以及 RememberMe 实现   在学习Spring Cloud 时,遇到了授权服务oauth 相关内容时,总是一知半解,因此决定先把 ...

  6. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_05-SpringSecurityOauth2研究-搭建认证服务器

    3 Spring Security Oauth2研究 3.1 目标 本项目认证服务基于Spring Security Oauth2进行构建,并在其基础上作了一些扩展,采用JWT令牌机制,并自定 义了用 ...

  7. 自定义HttpModule,用于未登录用户,不弹出Windows认证窗口,而是跳转回SSO站点

    2012年的一篇随笔记录,可以学习到如何自定义HttpModule,而具体里面针对需求开发的代码,可能未必能让大伙了解到什么,可快速扫描而过. using System; using System.W ...

  8. Shiro整合SSH开发3:配置Shiro认证后页面地址跳转问题(和详述不配置须要注意的问题)

         在视频教程中讲请求认证成功后跳转页面的问题是一笔带过的,可是我认为有必要单独写一篇相应的文章进行叙述.      我用了SSH来整合Shiro,在开发后验证的过程中,每次登陆后Shiro都会 ...

  9. Security - 轻量级Java身份认证、访问控制安全框架

    前言 此框架由小菜独立开发,并且已经在生产环境中运行大约一年时间. 也就是说,Security 框架写出来有一段时间了,但是一直没有公布.开源,经过不断迭代完善,终于算是拿得出手啦~ Security ...

随机推荐

  1. 如何给网页标题栏上添加图标(favicon.ico)

    favicon.ico详解:     favicon是Favorites Icon的缩写,favicon.ico是指显示在浏览器收藏夹.地址栏和标签标题前面的个性化图标. 设置步骤: 1. 把做好的f ...

  2. JSP标准库标签 ———C标签

    一.C标签    一] <c:out value="..." default="..." escapeXml="true">   ...

  3. SQL viewId 比较好看的 Id

    有时候我们希望 Id 要好看一些,比如 Id=1 -> Id=T000001 refer : http://www.kodyaz.com/t-sql/custom-sequence-string ...

  4. Bundle类

    1.新建一个Bundle类 Bundle bundle=new Bundle();2.Bundle类中放入数据(key-value的形式,另一个Activity里面取数据的时候,通过key值找出对应的 ...

  5. QML控件类关系图

    花了点时间整理了下QML控件之间的关系图和QML控件和C++类的对应关系,基于Qt5.6版本 其他版本可能会有差异 图片像素比较大,另存为后放大图片就可以看清楚了 工程下载地址 QMLClassDia ...

  6. c++ string类型转换为char *类型

    string 是c++标准库里面其中一个,封装了对字符串的操作 把string转换为char* 有3中方法: 1.data 如: string str="abc"; char *p ...

  7. BZOJ1651: [Usaco2006 Feb]Stall Reservations 专用牛棚

    1651: [Usaco2006 Feb]Stall Reservations 专用牛棚 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 509  Sol ...

  8. [LeetCode] 203. Remove Linked List Elements 解题思路

    Remove all elements from a linked list of integers that have value val. ExampleGiven: 1 --> 2 --& ...

  9. 关于我们 HerlMax(赫马克斯),奢侈品顶级服装高级定制品牌!

    关于我们 HerlMax(赫马克斯),奢侈品顶级服装高级定制品牌! HerlMax品牌拥有着纯正悠远的意大利高级定制文化,带着对神秘东方的向往,荣耀登入中国市场.

  10. Mac OS X Shell 脚本和终端命令

    系统 重启 Mac OS X: 1 shutdown - r now 关闭 Mac OS X: 1 shutdown now 电源管理/省电 获取当前电源管理设置的信息 1 pmset -g 设置显示 ...