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

1.权限管理设计

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

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

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

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

权限表:


角色表:


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

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


2.权限管理实现 

角色的权限

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)

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

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


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

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

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

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!"



        



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值