赞
踩
Flask并没有提供单独的这种权限管理模块,所有的web系统的权限管理无疑是大同小异的,都是表之间的关联。本实例系统也采用比较大众化的方法,采用权限——>角色——>用户的方法实现。使用的方法则采用注释的方法。
权限:单独的权限表,存储系统的不同权限代码
角色:每个角色由多个权限组成,比如管理员,协管员,普通用户,游客
用户:每个用户属于一个角色
权限表:
角色表:
权限的验证则采用位运算。比如用户1的角色为协管员,验证是否有写文章的权限
return (0b00000100 & 0b00001111) == 0b00000100 #返回True 则有,否则没有
角色的权限
- class Role(db.Model):
- __tablename__ = 'roles'
- id = db.Column(db.Integer, primary_key = True)
- name = db.Column(db.String(64), unique = True)
- default = db.Column(db.Boolean, default = False, index =True) #该角色是否默认角色
- permissions = db.Column(db.Integer) #角色的权限
- users = db.relationship('User', backref = 'role', lazy = dynamic)
- class Permission:
- FOLLOW = 0x01 #关注其他用户
- COMMENT = 0x02 #评论
- WHITE_ARTICLES = 0x04 #写文章
- MODERATE_COMMENTS = 0x08 #管理评论
- ADMINISTER = 0x80 #管理员权限
-
- class User(Usermixin, db.Model):
- #...
- def __init__(self, **kwargs):
- super(self, **kwargs).__init__(**kwargs)
- if self.role if None:
- if self.role is None:
- self.role = Role.query.filter_by(default = True).first()
新增角色验证功能
- from flask.ext.login import UserMixin, AnoymousUserMixin
-
- class User(UserMixin, db.Model):
- #...
- def can(self, permissions):
- return self.role is not None and \
- (self.role.permissions & permissions) == permissions
-
- def is_administrator(self):
- return self.can(Permission.ADMINISTER)
-
- class AnonymousUser(AnonymousUserMixin):
- def can(self, permissions):
- return False
- def is_administrator(self):
- return False
-
- login_manager.anonymous_user = AnonymousUser
- from functools import wraps
- from flask import abort
- from flask.ext.login import current_user
-
- def permission_required(permission):
- def decorator(f):
- @wrap(f)
- def decorated_function(*args, **kwargs):
- if not current_user.can(psermission):
- abort(403)
- return f(*args, **kwargs)
- return decorated_function
- return decorator
-
- def admin_required(f): #验证管理员权限的装饰器
- return permission_required(Permission.ADMINISTER)(f)
- @main.route('/admin')
- @login_required
- @admin_required
- def for_admins_only():
- return "For administrators!"
- @main.route('/moderator')
- @login_required
- @permission_required(Permission.MODERATE_COMMENTS)
- def for_moderators_only():
- return "For comment moderators!"
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。