Flask-用户角色及权限

app/models.py

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‘)

程序的权限

FOLLOW         关注用户              0x01

COMMET         在他人文章中发表评论  0x02

WRITE_ARTICLES     写文章         0x04

MODERATE_COMMENTS    管理他人发表的评论   0x08

ADMINISTER        管理员权限       0x80

class Permission:
    FOLLOW = 0x01
    COMMENT = 0x02
    WRITE_ARTICLES = 0x04
    MODERATE_COMMENTS = 0x08
    ADMINISTER = 0x80

列出了要支持的用户角色以及定义角色使用的权限位

用户角色

匿名        0x00      未登录的用户,在程序中只有阅读权限

用户        0x07      具有发表文章,发表评论和关注其他用户的权限。这是新用户的默认角色

协管员       0x0f       增加审查不当评论的权限

管理员       0xff       具有所有权限,包括修改其他用户所属角色的权限

app/models.py:在数据库中创建角色

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‘)

    @staticmethod
    def insert_roles():
        roles = {
            ‘User‘: (Permission.FOLLOW |
                     Permission.COMMENT |
                     Permission.WRITE_ARTICLES, True),
            ‘Moderator‘: (Permission.FOLLOW |
                          Permission.COMMENT |
                          Permission.WRITE_ARTICLES |
                          Permission.MODERATE_COMMENTS, False),
            ‘Administrator‘: (0xff, False)
        }
        for r in roles:
            role = Role.query.filter_by(name=r).first()
            if role is None:
                role = Role(name=r)
            role.permissions = roles[r][0]
            role.default = roles[r][1]
            db.session.add(role)
        db.session.commit()

这个Role表添加了一个静态方法,执行insert_roles函数会创建三个name,分别是用户,协管员和管理员

赋予角色:

app/models.py

class User(UserMixin,db.Model):
    __tablename__ = ‘users‘
    id = db.Column(db.Integer, primary_key=True)
    email = db.Column(db.String(64),unique=True,index=True)
    username = db.Column(db.String(64), unique=True,index=True)
    role_id = db.Column(db.Integer,db.ForeignKey(‘roles.id‘))
    password_hash = db.Column(db.String(128))

    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(permission=0xff).first()
            if self.role is None:
                self.role = Role.query.filter_by(default=True).first()

User表的方法是:如果用户没有设置权限,用户的邮箱等于配置中设置的管理员邮箱,就设置为管理员权限,用户的权限为空,则设置为普通用户

角色验证

app/models.py:检查用户是否有指定的权限

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)

can()方法在请求和赋予角色这两种权限之间进行位与操作。如果角色中包含请求的所有权限位,则返回True ,表示允许用户执行此项操作。

is_administrator()方法用来检车管理员权限

from flask_login import AnonymousUserMixin
class AnonymousUser(AnonymousUserMixin):
    def can(self,permissions):
        return False

    def is_administraror(self):
        return False

login_manager.anonymous_user = AnonymousUser

 这个类用来检查匿名用户的权限

app/decorators.py:检查用户权限的自定义修饰器

from functools import wraps
from flask import abort
from flask_login import current_user
from .models import Permission

def permission_required(permission):
    def decorator(f):
        @wraps(f)
        def decorated_function(*args, **kwargs):
            if not current_user.can(permission):
                abort(403)
            return f(*args, **kwargs)
        return decorated_function
    return decorator

def admin_required(f):
    return permission_required(Permission.ADMINISTER)(f)

这两个修饰器都使用了Python标准库中的functools包,如果用户不具有指定权限,则返回403错误码,即HTTP“禁止”错误。要添加一个403错误页面

以下的例子就是将上面的装饰器,用在了路由功能里面,针对一些页面设置了权限

from decorators import admin_required, permission_required
from .models import Permission
@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!"

  

在模板中可能也需要检查权限,所以Permission 类为所有位定义了常量以便于获取。为了避免每次调用render_template() 时都多添加一个模板参数,可以使用上下文处理器。上下文处理器能让变量在所有模板中全局可访问。

app/main/__init__.py:把Permission类加入模板上下文

@main.app_context_processor
def inject_permissions():
    return dict(Permission=Permission)

 

tests/test_user_models.py:角色和权限的单元测试

#...

    def test_roles_and_permissions(self):
        Role.insert_roles()
        u = User(email=‘[email protected]‘,password=‘cat‘)
        self.assertTrue(u.can(Permission.WRITE_ARTICLES))
        self.assertFalse(u.can(Permission.MODERATE_COMMENTS))

    def test_anonymous_user(self):
        u = AnonymousUser()
        self.assertFalse(u.can(Permission.FOLLOW))

  

时间: 2024-11-07 17:33:03

Flask-用户角色及权限的相关文章

WordPress各用户角色的权限

订阅者:只能修改自己的个人资料,例如昵称.联系信息.密码等等. 投稿者:具有订阅者的所有权限.可以发表文章,发表的文章需要经过管理员审核后才能在博客上显示出来,但可以预览效果.对待审中的文章可以编辑,但对已通过审核的文章不能编辑,可以查看所有站内评论,但不能对评论进行编辑. 作者:具有投稿者的所有权限.可以编辑已通过审核的文章,发表文章不需要审核,可以使用媒体库. 编辑:具有作者的所有权限.可以对文章标签.分类进行管理,可以管理友情链接,可以编辑评论,可以添加或编辑页面,还可以编辑待审中的文章,

RabbitMQ用户角色及权限控制 -2

1.RabbitMQ的用户角色分类: none.management.policymaker.monitoring.administrator none 不能访问 management plugin management 用户可以通过AMQP做的任何事情外 列出自己可以通过AMQP登入的virtual hosts   查看自己的virtual hosts中的queues, exchanges 和 bindings 查看和关闭自己的channels 和 connections 查看有关自己的vir

RabbitMQ用户角色及权限控制

RabbitMQ的用户角色分类:none.management.policymaker.monitoring.administrator RabbitMQ各类角色描述:none不能访问 management pluginmanagement用户可以通过AMQP做的任何事外加:列出自己可以通过AMQP登入的virtual hosts  查看自己的virtual hosts中的queues, exchanges 和 bindings查看和关闭自己的channels 和 connections查看有关

SpringSecurity 自定义用户 角色 资源权限控制

1 package com.joyen.learning.security; 2 3 import java.sql.ResultSet; 4 import java.sql.SQLException; 5 import java.util.List; 6 7 import org.springframework.context.support.MessageSourceAccessor; 8 import org.springframework.dao.DataAccessException;

Flask学习之八——用户角色

介绍的用户角色实现方式结合了分立的角色和权限: 即赋予用户分立的角色,但角色使用权限定义. 1. 角色在数据库中的表示 采用如下的权限 上述权限采用如下代码表示app/models.py:权限常量 class Permission: FOLLOW = 0x01 COMMENT = 0x02 WRITE_ARTICLES = 0x04 MODERATE_COMMENTS = 0x08 ADMINISTER = 0x80 采用如下的用户角色 在Role模型中增加跟权限有关的列 app/models.

t3用户-角色-权限hibernate经典配置

[java] view plain copy print? 用户-角色-权限hibernate经典配置. [java] view plain copy print? 既然有人问起,我就写下说明吧.在文章中间的配置文件那里.权当回忆一下,也帮助更多人.这是以前学校时写的,没有注释.都是贴的代码笔记.看到的莫要见怪.欢迎学习交流. [java] view plain copy print? [java] view plain copy print? 首先是三个实体类: [java] view pla

SqlServer 添加用户 添加角色 分配权限

--创建一个简单的登录,登录名为:newlogin:登录密码:123456:默认数据库:master,默认数据库也可以不指定. EXEC sp_addlogin 'newlogin','123456','master' --创建用户 --创建一个简单的用户,如果不指定用户名,则添加到当前数据库登录名中,如果不指定角色,则该用户默认属于public角色.下为添加newlogin登录名. EXEC sp_adduser 'newlogin' --创建一个带用户名的用户,用户可以与登录名相同(同上一种

用户、角色和权限,多表查询

一,各个表格 1.用户表 CREATE TABLE `t_user` ( `id` varchar(40) NOT NULL, `username` varchar(20) NOT NULL, PRIMARY KEY (`id`) ) 2.角色表 CREATE TABLE `t_role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) NOT NULL, `description` varchar(255) DEFAULT

用户角色权限

1.用户表SYS_USER ID ORG_ID LOGIN_NAME PASSWORD USER_NAME PHONE EMAIL CREATE_TIME LOGIN_TIME 主键ID 组织ID 用户登陆名 用户密码 用户姓名 手机号 电子邮箱 创建时间 登陆时间 2.角色表SYS_ROLE ID ROLE_ID PARENT_ROLE_ID ROLE_NAME CREATE_TIME ROLE_DESCRIPTION 主键ID 角色ID 父级角色ID 角色名称 创建时间 角色描述 3.权限表

RBAC用户角色权限设计方案

转自http://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色-权限”的授权模型.在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系.(如下图) 角色是什么?可以理解为一定数量的权限的集合,权限的载体.例如:一个论坛系统