一个webapp会有好多路由,我们希望限制有些用户能访问哪些路由、有些用户不能访问哪些路由,这就是权限管理。网上关于flask权限管理的文章有好多,我是通过一个简单的方式实现的,就是用户在登陆后查看其是否有访问这个路由的权限。
怎么来实现这个功能呢,这肯定离不开装饰器的帮助,包括只有登陆的用户才能访问url,都需要在flask的view视图函数下面加个装饰器。
下面是一个必须登陆才能访问的装饰器def is_login(view_func):
@functools.wraps(view_func) def wrapper(*args,**kwargs): user_id = session.get('user_id') g.user_id = user_id if user_id: return view_func(*args,**kwargs) else: return jsonify(code=0,msg='请登录')
return wrapper
如果session中有这个user_id就是让其访问,如果没有就提示请登陆,或直接跳转登陆页面
接下来,就是关于权限的装饰器了
def is_urltrue(view_func): @functools.wraps(view_func) def wrapper(*args,**kwargs): user_id = session.get('user_id') g.user_id =user_id map = request.base_url g.map = map id = R_get_role(user_id) map_list = is_who(id) if map in map_list: return view_func(*args,**kwargs) else: return jsonify(code=0,msg='权限不够') return wrapper
这段代码是我仿照着第一个登陆代码逻辑写的,首先也是去获得用户的id,然后通过id去数据库中找到其角色id,看这个角色的权限是否有资格访问这个路由,flask有个获取当前访问url路由的方法,request.base_url,通过这个方法就可以知道其当然访问的路由是什么,再去判断这个路由在不在他的角色能访问的路由列表中,如果在就让其访问,不在就提示权限不够。
我们把所有的角色对应的路由列表写在一个Py文件中,有点类似配置文件,可以随时去改动。这个就是我一个大概的思路
代码为手敲,导包并未提供,有的地方如果有疏漏还请见谅,如果有什么建议,请留言,感激不尽。