关闭

用flask开发个人博客(34)—— 用户角色权限的分配

标签: 用户权限角色flasklogin
2143人阅读 评论(5) 收藏 举报
分类:

一、引言

        在很多具有用户操作的系统中,无可避免用户权限的问题。我们知道用户角色本质就是用户权限的集合,本文主要学习一种flask中管理用户角色和权限分配的方法。

二、程序的执行权限

        我们将程序的权限分为下面几种:

关注其他用户 0b00000001(0x01)
评论其他人的文章 0b00000010(0x02)
写文章 0b00000100(0x04)
管理他人的评论 0b00001000(0x08)
管理员 0b10000000(0x80)
        对于未注册用户,只有阅读文章的权限,无需再这里进行表示;对于普通的注册用户,应该具有关注其他用户、评论其他人的文章、写文章的权限,按位组合起来就是0x07;而对于可以删除恶意评论的协管员具有除了管理员之外的所有权限,组合起来就是0x0f;而对于管理员权限组合可表示为0xff。
       为了方便用户权限的分配,我们可以将所有的权限定义成一个类:
class Permission:
    FOLLOW=0x01
    COMMENT=0x02
    WRITE=0x04
    MANAGE_COMMENTS=0x08
    ADMIN=0x80
       在角色模型中增加一个表示权限的字段——permission:
class Role(db.Model):  
    __tablename__='role'  
    id=db.Column(db.Integer,primary_key=True)
    name=db.Column(db.String(64),unique=True)
    permission=db.Column(db.Integer)
    users=db.relationship('User',backref='role',lazy='dynamic')
      定义一个全局函数用来向数据表roles中插入对应的角色:

def create_roles():
    roles={'User':Permission.FOLLOW|Permission.COMMENT|Permission.WRITE,
            'Moderator':Permission.FOLLOW|Permission.COMMENT|Permission.WRITE|Permission.MANAGE_COMMENTS,
            'Admin':Permission.FOLLOW|Permission.COMMENT|Permission.WRITE|Permission.MANAGE_COMMENTS|Permission.ADMIN
            }
    for r in roles:
        print r
        role = Role.query.filter_by(name=r).first()
        if role is None:
            role=Role(name=r)
        role.permission=roles[r]
        db.session.add(role)
    db.session.commit()
       我们在manager.py中将create_roles引入shell环境中:
def make_shell_context():  
    return dict(app=app,db=db,User=User,Role=Role,create_roles=create_roles)  
      在shell中执行create_roles(),我们成功在roles表中增加了上述三个角色:

三、角色赋予和权限验证

       为了给用户赋予角色,我们需要重新修改User的构造函数:
def __init__(self,**kwargs):
        super(User,self).__init__(**kwargs)
        if self.role is None:
            if self.name == 'Hyman':
                self.role=Role.query.filter_by(permission=0x8f).first()
            if self.role is None:
                self.role=Role.query.filter_by(permission=0x07).first()
        我们在User的构造函数中先调用了其父类的构造函数。接着先判断用户是不是已经有了角色,如果没有就新增角色。先是通过姓名判断是不是"Hyman",如果是就赋予管理员角色。这里用名称作为是否是管理员的判断标准,其实不够合理,正常情况下我们可以增加一个email或者电话的字段作为用户的唯一性标识,以此来作为是否为管理员的标准。接下来如果不是管理员,将用户角色设置成普通用户的角色。
       为了验证一个用户是否具有相应的权限,我们需要在User中增加相应的接口:
 def can(self,permission):
        return self.role is not None and (self.role.permission & permission) == permission

    def is_admin(self):
        return self.can(Permission.ADMIN)
      can函数用来判断用户是不是具有某种权限,而is_admin内部调用can函数用来判断user是不是管理员。为了实现未登录用户也能判断权限,我们可以定义一个类继承自Flask-Login中的AnonymousUserMixin类,并将其设为用户未登录时的current_user的值。
    
class AnonymousUser(AnonymousUserMixin):
    def can(self,permission):
        return False
    def is_admin(self):
        return False

loginmanager.anonymous_user=AnonymousUser


Github位置:
https://github.com/HymanLiuTS/flaskTs
克隆本项目:
Git clone Git@github.com:HymanLiuTS/flaskTs.Git
获取本文源代码:
git checkout FL34



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:370451次
    • 积分:6490
    • 等级:
    • 排名:第3958名
    • 原创:292篇
    • 转载:17篇
    • 译文:1篇
    • 评论:61条
    其它平台
    博客专栏