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

通过三个model实现:

User,存放用户数据

Role,存放角色数据

User_Role.存放用户角色信息

user_datastore = SQLAlchemyUserDatastore(db, User, Role)

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

比如我们新建一个view:

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

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

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

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

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

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

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

我们看看其源代码:

def wrapper(fn):
@wraps(fn)
def decorated_view(*args, **kwargs):
perms = [Permission(RoleNeed(role)) for role in roles]
for perm in perms:
if not perm.can():
if _security._unauthorized_callback:
return _security._unauthorized_callback()
else:
return _get_unauthorized_view()
return fn(*args, **kwargs)
return decorated_view
return wrapper

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

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

然后继续看其代码:

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

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

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

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

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

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

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

然后添加一个视图:

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

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

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

def set_unauth_view(url):
def wrapper(fn):
def decorator(*args, **kwargs):
current_app.config['SECURITY_UNAUTHORIZED_VIEW'] = url
return fn(*args, **kwargs)
return decorator
return wrapper

然后:

@app.route('/dashboard')
@set_unauth_view('/unauth')
@roles_required('admin', 'editor')
def dashboard():
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. 转:VC中UpdateData()函数的使用

    VC中UpdateData()函数的使用 UpdateData(FALSE)与UpdateData(TRUE)是相反的过程     UpdateData(FALSE)是把程序中改变的值更新到控件中去  ...

  2. ASP.NET 表单认证与角色授权

    参考 : http://hi.baidu.com/iykqqlpugocfnqe/item/e132329bdea22acbb6253105  ASP.NET中处理请求的流程图 http://www. ...

  3. Altium Designer同一个工程里不同原理图导入到不同的PCB

    问题: 在用Altium Designer进行PCB工程设计时,有时一个工程里可能不止一块PCB,比如,一个设备里有主板和扩展板或者按键板等等,这时就需要在一个工程里添加多个PCB文件.如图: 我们知 ...

  4. Printing Architecture

    Printing Architecture http://www.codeproject.com/Articles/8916/Printing-Architecture     This articl ...

  5. alias, bg, bind, break, builtin, caller, cd, command,

    bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command,       compgen, complete, com ...

  6. ortp使用详解2

    五:数据的接收和发送 1. 发送过程: 应用发送数据时调用接口 rtp_session_send_with_ts 完成.参数为会话句柄,数据缓冲区地址,数据长度以及应用当前的时间戳.在该接口中,会先调 ...

  7. MSSQL 生成有意义的PROC

    MSSQL 生成有意义的PROC --MSSQL  用PROC 生成有意义的单号:如WP200011101 GO/****** 对象:  Table [dbo].[tbl_SequenceNum]   ...

  8. app后端设计--总目录

    做了3年app相关的系统架构,api设计,先后在3个创业公司中工作,经历过手机网页端,android客户端,iphone客户端,现就职于app云后端平台bmob(想了解bmob点击这里).其中的乐与苦 ...

  9. B - Network - uva 315(求割点)

    题意:给一个无向连通图,求出割点的数量. 首先输入一个N(多实例,0结束),下面有不超过N行的数,每行的第一个数字代表后面的都和它存在边,0表示行输入的结束(很蛋疼的输入方式). 分析:割点的模板题 ...

  10. 使用 AtomicInteger 进行计数(java多线程优化)

    通常,在我们实现多线程使用的计数器或随机数生成器时,会使用锁来保护共享变量.这样做的弊端是如果锁竞争的太厉害,会损害吞吐量,因为竞争的同步非常昂贵. volatile 变量虽然可以使用比同步更低的成本 ...