flask权限管理

admin 2024-04-10 26次阅读

同flask-login一样, flask- 也提供了一个 装饰器,

通过auth对象调用即可控制 用户名, 密码 的登录权限控制。

token官网最新消息

token权限管理

tokenpocet官网

这里比较复杂的地方就是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 权限管理·(中国)官方网站,

以及使用了扩展以后对于定制自己的东西该如何写,

这时候还是最好去看使用相应扩展的源码, 然后以此为基础, 展开自己的工作吧!