关闭

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

标签: 用户权限角色flasklogin
3257人阅读 评论(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
查看评论

使用 JWT 让你的 RESTful API 更安全

传统的 cookie-session 机制可以保证的接口安全,在没有通过认证的情况下会跳转至登入界面或者调用失败。 在如今 RESTful 化的 API 接口下,cookie-session 已经不能很好发挥其余热保护好你的 API 。 更多的形式下采用的基于 Token 的验证机制,JWT 本...
  • liuwenbiao1203
  • liuwenbiao1203
  • 2016-08-29 11:56
  • 21266

Flask-JWT 小坑:No JSON object could be decoded;AttributeError: 'NoneType' object has no attribute 'get

使用官方的 “QuickStart” 时, Flask-JWT — Flask-JWT 0.3.2 documentation https://pythonhosted.org/Flask-JWT/ 出现了两个小坑: 1) 用命令行: H:\>curl -i -X POST -...
  • Kevin_QQ
  • Kevin_QQ
  • 2016-11-21 09:39
  • 3711

Flask权限篇flask_principal

最近写CMDB的时候遇到了一个问题,那就是flask的权限问题,目前我了解到的Flask有3种方案进行权限管理的操作, Flask狗书中的十六进制的权限值来实现 Flask-Security Flask Principal先跳过第一种,可能纯属是我技术的原因吧,我觉得有轮子不用反复造的想法,所以就跳...
  • qq850482461
  • qq850482461
  • 2017-07-26 09:54
  • 1652

用 Flask 来写个轻博客 (25) — 使用 Flask-Principal 实现角色权限功能

目录目录 前文列表 扩展阅读 Flask-Principal 使用 Flask-Principal 来实现角色权限功能 添加 Role Model 在 Manager shell 中手动的添加角色 初始化 Flask-Principal 和 Permission 实现权限载入信号逻辑 实现身份改变信...
  • Jmilk
  • Jmilk
  • 2016-12-09 18:08
  • 8361

Flask Web 开发 用户角色

进入第九章,内容就3小节,不过需要补的东西还挺多的 class Role(db.Model): __tablename__='roles' id=db.Column(db.Integer,primary_key=True) name=db.Column(db.String(6...
  • bestallen
  • bestallen
  • 2016-08-31 14:38
  • 2393

基于Flask实现后台权限管理系统 - Flask

1. Flask 1.1. 简介 Flask是使用Python编写的轻量级Web应用框架,其WSGI工具箱采用Werkzeug,模板引擎则使用Jinja2。Flask使用BSD授权,Flask也被称为“microframework”,因为它使用简单的核心,用extension增加...
  • zhujf21st
  • zhujf21st
  • 2017-09-20 17:28
  • 896

通用权限管理系统(设计文档,数据库,及Web和WPF两种实现方式)

  • 2011-03-15 09:28
  • 6.54MB
  • 下载

基于Flask实现后台权限管理系统 - 导言

网上有这样一个段子,在评论语言好坏的时候,都会有人评论说PHP是世界上最好的语言,人生苦短我用Python,这里姑且不去评论语言的好坏,每一个语言存在都有它的价值,譬如C语言适合底层开发,整个Linux操作系统几乎都是用C语言开发的,而像Go语言适合高并发的网络开发一样,并不是说像Go干不了其它事情...
  • zhujf21st
  • zhujf21st
  • 2017-09-20 17:28
  • 368

用flask开发个人博客(31)——用flask_login管理用户的登录

一、flask_login的安装         本文主要介绍使用flask_login管理用户的登录和登出。flask_login的安装: pip install flask-login 二、User模型继承UserMixin     ...
  • lzhui1987
  • lzhui1987
  • 2017-01-02 22:27
  • 4565

flask之用户角色和用户资料编辑

flask web python
  • u010745324
  • u010745324
  • 2016-12-18 15:00
  • 846
    个人资料
    • 访问:513838次
    • 积分:7976
    • 等级:
    • 排名:第3115名
    • 原创:303篇
    • 转载:17篇
    • 译文:1篇
    • 评论:72条
    其它平台
    博客专栏