9.1 为我们的角色划分权限

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

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

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

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

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

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

0x00000100 (0x04)

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

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

class Permission():

    FOLLOW = 0x01

    COMMIT = 0x02

    WRITE_ARTICLE = 0x04

    MODERATE_COMMIT = 0x08

    ADMINISTER = 0x80

class 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的话, 把该用户的角色设置为管理员, 否则默认设置为用户。










  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值