当前位置:   article > 正文

flask框架-认证权限(一):使用g对象存登录用户信息,认证权限一起实现_flask 登录验证和权限验证

flask 登录验证和权限验证

一、项目结构和基本的依赖包

apps

        -user

        __init__.py

authen

       __init__.py

        token.py

ext

        __init__.py

util.py

       public.py

        __init__.py

app.py

依赖包

  1. alembic==1.8.1
  2. click==7.1.2
  3. Flask==1.1.4
  4. Flask-Migrate==2.7.0
  5. Flask-Script==2.0.6
  6. Flask-SQLAlchemy==2.4.1
  7. greenlet==2.0.1
  8. importlib-metadata==5.0.0
  9. importlib-resources==5.10.0
  10. itsdangerous==1.1.0
  11. Jinja2==2.11.3
  12. Mako==1.2.4
  13. MarkupSafe==2.0.1
  14. PyMySQL==1.0.2
  15. SQLAlchemy==1.3.0
  16. typing_extensions==4.4.0
  17. Werkzeug==1.0.1
  18. zipp==3.10.0
  19. Flask-RESTful==0.3.9
  20. PyJWT==2.7.0
  21. websocket-client==1.5.1
  22. gevent==22.10.1
  23. gevent-websocket==0.10.1
  24. Flask-Caching==2.0.2
  25. redis==4.5.5

二、配置token认证和解析

authen/token.py

  1. from flask import request,g
  2. import jwt
  3. import time
  4. from flask import jsonify
  5. from functools import wraps #类装饰器
  6. #导入用户表:这个根据用户自己来
  7. from apps.user.models import UserModel
  8. JWT_SECRET_KEY = '$#%^&&*(DFHJKUTYGHF112312' #加密的盐
  9. ALGORITHM = 'HS256' #加密算法
  10. #生成token
  11. def jwt_encode_token(user_id:int,time_out=7*24*60*60):
  12. payload = {
  13. 'user_id': user_id,
  14. 'iat': time.time(), #产生token时的时间戳
  15. 'exp': time.time() + time_out #token过期时间戳
  16. }
  17. token = jwt.encode(payload, JWT_SECRET_KEY, algorithm=ALGORITHM)
  18. return token
  19. #解析token
  20. def jwt_decode_token(token):
  21. secret = JWT_SECRET_KEY
  22. payload = jwt.decode(token,secret,algorithms=ALGORITHM)
  23. return payload
  24. #类装饰器:需要认证
  25. def login_required(func):
  26. @wraps(func)
  27. def wrapper(*args, **kwargs):
  28. token = request.cookies.get('token', "none")
  29. if not token:
  30. token = request.headers.get('token', "none")
  31. try:
  32. payload = jwt_decode_token(token)
  33. except Exception as e:
  34. return jsonify({'code': 410, 'error': 'token有问题'}),403
  35. user_id = payload.get('user_id')
  36. exp = payload.get('exp')
  37. now = time.time()
  38. obj = UserModel.query.filter_by(id=user_id).first()
  39. if not obj:
  40. return jsonify({'code': 410, 'error': 'token有问题'}),403
  41. if exp < now:
  42. return jsonify({'code': 410, 'error': 'token已经过期了'}),403
  43. g.user = obj
  44. #认证通过,执行视图函数
  45. return func(*args,**kwargs)
  46. return wrapper
  47. def authen_admin_required(func):
  48. @wraps(func)
  49. def wrapper(*args, **kwargs):
  50. if not hasattr(g,'user'):
  51. return jsonify({'code':410,'msg':'请先登录'})
  52. if g.user.role != '管理员':
  53. return jsonify({'code': 410, 'msg': '没有管理员权限,无法操作'}), 403
  54. # 认证通过,执行视图函数
  55. return func(*args, **kwargs)
  56. return wrapper
  57. if __name__ == '__main__':
  58. token = jwt_encode_token(78)

三、视图类使用

user/views.py

  1. from flask.views import MethodView
  2. from flask import jsonify
  3. from flask import request,g
  4. from ext import db
  5. #模型类
  6. from . import models
  7. #认证相关的
  8. from authen.token import jwt_encode_token,login_required,admin_required,authen_admin_required
  9. class RoleView(MethodView):
  10. #所有视图函数都需要登录认证
  11. decorators=[login_required]
  12. def get(self):
  13. objs = models.RoleModel.query.all()
  14. lis = []
  15. for obj in objs:
  16. lis.append({'id':obj.id,'name':obj.name})
  17. return jsonify({'code':200,'data':lis})
  18. #post请求需要有管理员权限
  19. @authen_admin_required
  20. def post(self):
  21. print(g.user)
  22. name = request.form.get('name')
  23. if not name:
  24. return jsonify({'code':400,'error':'请携带上权限名'})
  25. obj = models.RoleModel.query.filter_by(name=name).first()
  26. if obj:
  27. return jsonify({'code':400,'error':f'{name} 权限已经存在了'})
  28. else:
  29. obj = models.RoleModel()
  30. obj.name=name
  31. db.session.add(obj)
  32. db.session.commit()
  33. return jsonify({'code':200,'msg':f'新增角色:{name} 成功'})

认证大致的逻辑:

1、用户登录时,生成token,前端保存token信息

2、前端发起请求时,将token携带在cookies或请求头中

3、后端拿到token,先解析出token的用户信息,将用户信息存到g对象中

4、认证通过后,就可以在请求函数中通过g获取到当前登录的用户。

管理员权限认证的逻辑:

1、依赖于登录认证的流程,

2、在进入视图函数前,先检验是否通过登录认证了

3、登录认证通过了,就可以通过g获取当前登录的用户信息

4、再对登录的用户的信息进行权限的判断

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号