对于web程序用户权限是经常用到的基础性功能。具体来说,不同权限用户对web程序操作范围不同,比如程序里最高权限可以进行建库、删库等高等级操作,最低权限用户只能查看程序部分web界面内容,和限制性的编辑功能。高权限等级用户需要登陆系统才能进行对应权限操作,而对于最低权限等级的游客可以不登陆查看部分web界面。
这里我们主要用Flask-security来实现用户权限问题。
@login_required
def post():
pass
注意:To enable this, if the application configuration variable LOGIN_DISABLEDis set toTrue, this decorator will be ignored.
进一步可以直接用roles_required装饰器限定哪个权限等级可以访问被装饰函数:
@app.route('/dashboard')
@roles_required('admin', 'editor')
def dashboard():
return 'Dashboard'
注意必须同时满足'admin'和 'editor'权限。
相应的roles_accepted装饰器中,只要满足其中一个权限即可访问被装饰函数create_post():
@app.route('/create_post')
@roles_accepted('editor', 'author')
def create_post():
return 'Create Post'
以上功能建立在User-Role 数据库模型之上,User和Role至少包含以下几个Fields:
User
id
email
password
active
Role
id
name
description
以上Fields是最小模型,可以进行扩展,但不能再进行删减。想改动最小模型,只能手打一个模块了,这里不讨论了。
如开源软件https://gitee.com/beipingOS/deshu-wms中,roles_users模型,和roles和users定义如下:
roles_users = db.Table(
'roles_users',
db.Column('user_id', db.Integer(), db.ForeignKey('user.id')),
db.Column('role_id', db.Integer(), db.ForeignKey('role.id'))
)
class Role(db.Model, RoleMixin):
id = db.Column(db.Integer(), primary_key=True)
name = db.Column(db.String(80), unique=True)
description = db.Column(db.String(255))
def __str__(self):
return self.name
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(255), nullable=False)
last_name = db.Column(db.String(255))
email = db.Column(db.String(255), unique=True, nullable=False)
password = db.Column(db.String(255), nullable=False)
active = db.Column(db.Boolean())
confirmed_at = db.Column(db.DateTime())
roles = db.relationship('Role', secondary=roles_users,
backref=db.backref('users', lazy='dynamic'))
def __str__(self):
return self.email
代码比较简单,可以直接用到其他的web程序中。Roles可以按自己程序设计的需要去定义。