flask权限管理
同flask-login一样, flask- 也提供了一个 装饰器,
通过auth对象调用即可控制 用户名, 密码 的登录权限控制。
token权限管理
这里比较复杂的地方就是token的权限管理了, 因为此处没有拓展可用(扩展是为了通用性, 但是token不是强制使用的),都是自己踩坑弄出来的,写在博客里做一个纪录。
什么是token
token是用户信息(一般是用户idimToken,
具有唯一标识作用)的标识。对用户id进行签名加密(我一般使用模块),
例如:
from itsdangerous import TimedJSONWebSignatureSerializer as Serializer # 此函数为User类的成员函数 def generate_auth_token(self): s = Serializer( current_app.config['SECRET_KEY'], # 密钥很重要 expiration # Token的寿命 ) # 用获取的签名加密用户id信息 return s.dumps({'id': self.id})
为什么需要token
token 一般使用在API的场景中, 此时 客户端和服务器端是分离的 ,
数据信息通过API进行传递, 他人很容易就可以拦截API并获取验证头部的 字段,
从而获取用户名和密码(一般是进行了加密, 但是很容易被破解), 这样是极不安全的。
之所以需要验证, 其实就是为了标识这个用户是谁, 而id就是一个最好的标识,
所以通过用户的 用户名和密码请求token (这样用户名和密码不会频繁被发送),
用获取的token放在API头部进行传递, 这样即使被拦截,
也不会获取用户的敏感信息(用户名, 密码), 即使token被他人使用,
也会因为token的寿命而使破坏性大大降低。
token的使用: 发送token
token需放在 头部, 采用如下形式发送:
"Basic token"
token的使用: 解析token
依然采用 模块, 这里 密钥 就很重要了,
只有与加密相同的密钥才可以解析token。
# User类的一个静态成员函数 @staticmethod def verify_auth_token(token): # 获取签名 s = Serializer(current_app.config["SECRET_KEY"]) try: data = s.loads(token) # 用签名解析token except: return None # 返回该token标识的用户 return User.query.filter_by(id=data['id'])
基于token的权限管理
这里主要是区别普通用户和管理员用户, 因为有些特定的操作是只有管理员可以进行的。
1.在User类里添加管理员判断函数
def can(self, permission): # 判断用户是否具备某权限 return self.role is not None and (self.role.permissions & permissions) = permissions def is_adminstractor(self): # 判断用户是否具备管理员权限 return self.can(Permission.COMMENT | Permission.MODERATE_COMMENT)
2.创建 管理员权限判断装饰器
from functools import wraps from flask import request, g def admin_required(f): @wraps(f) def decorator(*args, **kwargs): token_header = request.headers.get('authorization') token = token_header[6:] # 去掉格式中的Basic if token: g.current_user = User.verify_auth_token(token) if g.current_user.is_adminstractor(): return f(*args, **kwargs) else: abort(403) return decorator
然后就可以使用 装饰器进行权限管理了,
这里有个坑提一下就是 flask- 会自己添加Basic,
所以使用该扩展的地方就不必考虑token格式的问题了。
总结
flask权限管理比较烦的地方就是如何使不同的权限管理扩展一起工作token 权限管理·(中国)官方网站,
以及使用了扩展以后对于定制自己的东西该如何写,
这时候还是最好去看使用相应扩展的源码, 然后以此为基础, 展开自己的工作吧!
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。