当前位置:   article > 正文

[python3.6 flask web学习]Flask用户权限管理_flask 权限管理 实现

flask 权限管理 实现

1.权限管理设计

Flask并没有提供单独的这种权限管理模块,所有的web系统的权限管理无疑是大同小异的,都是表之间的关联。本实例系统也采用比较大众化的方法,采用权限——>角色——>用户的方法实现。使用的方法则采用注释的方法。

权限:单独的权限表,存储系统的不同权限代码

角色:每个角色由多个权限组成,比如管理员,协管员,普通用户,游客

用户:每个用户属于一个角色

权限表:


角色表:


权限的验证则采用位运算。比如用户1的角色为协管员,验证是否有写文章的权限

return (0b00000100 & 0b00001111) == 0b00000100 #返回True 则有,否则没有


2.权限管理实现 

角色的权限

  1. class Role(db.Model):
  2. __tablename__ = 'roles'
  3. id = db.Column(db.Integer, primary_key = True)
  4. name = db.Column(db.String(64), unique = True)
  5. default = db.Column(db.Boolean, default = False, index =True) #该角色是否默认角色
  6. permissions = db.Column(db.Integer) #角色的权限
  7. users = db.relationship('User', backref = 'role', lazy = dynamic)

在model.py中新增一个辅助类,表示角色权限

  1. class Permission:
  2. FOLLOW = 0x01 #关注其他用户
  3. COMMENT = 0x02 #评论
  4. WHITE_ARTICLES = 0x04 #写文章
  5. MODERATE_COMMENTS = 0x08 #管理评论
  6. ADMINISTER = 0x80 #管理员权限

用户的角色在初始化的时可以默认,app/models.py

  1. class User(Usermixin, db.Model):
  2. #...
  3. def __init__(self, **kwargs):
  4. super(self, **kwargs).__init__(**kwargs)
  5. if self.role if None:
  6. if self.role is None:
  7. self.role = Role.query.filter_by(default = True).first()


新增角色验证功能

  1. from flask.ext.login import UserMixin, AnoymousUserMixin
  2. class User(UserMixin, db.Model):
  3. #...
  4. def can(self, permissions):
  5. return self.role is not None and \
  6. (self.role.permissions & permissions) == permissions
  7. def is_administrator(self):
  8. return self.can(Permission.ADMINISTER)
  9. class AnonymousUser(AnonymousUserMixin):
  10. def can(self, permissions):
  11. return False
  12. def is_administrator(self):
  13. return False
  14. login_manager.anonymous_user = AnonymousUser

3.自定义装饰器使用权限管理

  1. from functools import wraps
  2. from flask import abort
  3. from flask.ext.login import current_user
  4. def permission_required(permission):
  5. def decorator(f):
  6. @wrap(f)
  7. def decorated_function(*args, **kwargs):
  8. if not current_user.can(psermission):
  9. abort(403)
  10. return f(*args, **kwargs)
  11. return decorated_function
  12. return decorator
  13. def admin_required(f): #验证管理员权限的装饰器
  14. return permission_required(Permission.ADMINISTER)(f)


使用

  1. @main.route('/admin')
  2. @login_required
  3. @admin_required
  4. def for_admins_only():
  5. return "For administrators!"

  1. @main.route('/moderator')
  2. @login_required
  3. @permission_required(Permission.MODERATE_COMMENTS)
  4. def for_moderators_only():
  5. return "For comment moderators!"



        



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

闽ICP备14008679号