博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
9.1 为我们的角色划分权限
阅读量:4094 次
发布时间:2019-05-25

本文共 2471 字,大约阅读时间需要 8 分钟。

在第五章数据库的时候, 我们创建了Role表,并创建了不同的角色。

不同的角色要有不同的权限, 本节我们来为角色划分权限。

————————————————————————————————

一.为我们的角色划分权限

我们知道, 社交博客应该具有以下权限:

操作 位值
关注用户 0x00000001 (0x01)
在他人文章发表评论 0x00000010 (0x02)
写文章

0x00000100 (0x04)

管理他人发表的评论 0x00001000 (0x08)
管理员权限 0x10000000 (0x80)

我们用不同的位值来表示不同的权限, 代码实现如下:

class Permission():    FOLLOW = 0x01    COMMIT = 0x02    WRITE_ARTICLE = 0x04    MODERATE_COMMIT = 0x08    ADMINISTER = 0x80class Role(UserMixin, db.Model):    id = db.Column(db.Integer, primary_key=True)    name = db.Column(db.String(64), unique=True, index=True)    #只有角色为用户时default属性值才为True, 表示在注册时, 默认角色为用户。    default = db.Column(db.Boolean, default=False, index=True)    permissions = db.Column(db.Integer)  #每个用户的permissions值, 表示他具有的权限    users = db.relationship('User', backref='role', dynamic='lazy')    @staticmethod    def insert_roles():        #定义角色字典, 键为角色名, 值为权限和默认值组成的元组, 这样一个角色的所有属性都包括在字典里了        roles = {            'User':(Permission.Follow|                       Permission.Commit|                       Permission.WRITE_ARTICLE, True),             'Moderator':(Permission.FOLLOW|                                  Permission.Commit|                                  Permission.WRITE_ARTICLE|                                  Permission.MODERATE_COMMIT, False),             'Administrator':(0xff, False)       }       for r in roles:  #遍历字典, 得到的r为角色名           #在数据库中搜索该角色, 没有的话创建该角色           role = Role.query.filter_by(name=r).first()            if not role:               role = Role(name=r)           #设置permissions和default属性值           role.permissions = roles[r][0]           role.default = roles[r][1]           #把改动添加到会话           db.session.add(role)        #提交会话        db.session.commit()

此处我们添加了一个往数据库的Role表添加角色的函数insert_role, 字典会使添加新用户和改变用户权限变得更加灵活, 下面我们演示添加角色:

数据库的变化更加直观:

————————————————————————————————————————————

二.赋予角色:

class User(UserMixin, db.Model):    def __init__(self, **kwargs):        super(User, self).__init__(**kwargs)        if self.role is None:            if self.email == current_app.config['FLASKY_ADMIN']:                self.role = Role.query.filter_by(permissions=0xff).first()            else:                 self.role = Role.query.filter_by(default=True).first()    #...

我们为User表增加了一个构造函数, 先调用父类构造函数创建角色;

创建用户的代码在auth.register视图函数中:

    u = User(email=form.email.data, username=form.username.data, password=form.password.data)

    并没有指定角色, 所以构造函数中又加了个判断条件, 如果角色没有指定, 如果该注册用户的email是config字典中存储的管理员email的话, 把该用户的角色设置为管理员, 否则默认设置为用户。

你可能感兴趣的文章
算法分析之渐近分析(Asymptotic Analysis)
查看>>
最小总距离点的最优位置
查看>>
Android SDK在线更新镜像服务器
查看>>
提升数据库数据查询效率
查看>>
从N个不同数字中等概率取出M个数字(N>=M)
查看>>
Linux下安装GitHub
查看>>
设计模式之代理模式
查看>>
设计模式之组合模式
查看>>
版本号比较(Compare two Version numbers)
查看>>
垃圾回收算法之分代回收算法
查看>>
垃圾回收算法之标记-清除算法
查看>>
垃圾回收算法之标记-整理算法
查看>>
垃圾回收算法之复制算法
查看>>
Java虚拟机工具之虚拟机进程状况工具jps
查看>>
Java虚拟机工具之虚拟机统计监控工具jstat
查看>>
sed编辑器基础之替换命令
查看>>
gawk程序基础
查看>>
JVM架构之JVM工作原理
查看>>
Java中的垃圾回收
查看>>
sed编辑器基础之替换命令(二)
查看>>