Flask实现基于角色的访问控制(RBAC)-创新互联
Flask的核心在于”Micro”,因此它不像Django拥有很多功能,尤其是认证系统。因此使用Flask要自己写一个认证系统。下面就给大家分享一下简单的Flask实现RBAC。下面都是在models.py文件的代码
创新互联是一家专注于网站设计制作、成都网站制作与策划设计,荣昌网站建设哪家好?创新互联做网站,专注于网站建设十载,网设计领域的专业建站公司;建站业务涵盖:荣昌等地区。荣昌做网站价格咨询:189820811081、权限常量
class Permission:
COMMENT = 0x02
ADMINISTER = 0x80
2、角色表
class Role(db.Model):
__tablename__ = 'roles'
id =db.Column(db.Integer,primary_key=True)
name =db.Column(db.String(255),unique=True)
default = db.Column(db.Boolean,default=False,index=True)
permissions = db.Column(db.Integer)
users = db.relationship('User',backref='role',lazy='dynamic')
def __repr__(self):
return '
将角色手动添加到数据库中,即耗时又容易出错,最便捷的又不容易出错的方法就是写一个静态方法。
class Role(db.Model):
……
@staticmethod
def insert_roles():
roles = {
'User': (Permission.COMMENT,True),
'Administrator': (0xff,False)
}
for ro in roles:
role= Role.query.filter_by(name=ro).first()
ifrole is None:
role = Role(name=ro)
role.permissions = roles[ro][0]
role.default = roles[ro][1]
db.session.add(role)
db.session.commit()
3、用户表
class User(UserMixin,db.Model):
__tablename__ = 'users'
id =db.Column(db.Integer,primary_key=True)
username =db.Column(db.String(255),unique=True,index=True)
passwd =db.Column(db.String(255))
email =db.Column(db.String(255),unique=True,index=True)
role_id = db.Column(db.Integer,db.ForeignKey('roles.id'))
def __repr__(self):
'
4、赋予角色
用户在注册时,会赋予适当的角色。用户注册时赋予的角色都是普通用户,这是默认角色。但管理员就比较列外了。管理员由设置的变量CMDB_ADMIN来识别,当注册的邮箱和设置的该变量的值一样就会自动设置为管理员。
Class User(UseMin,db.Model):
……
def__init__(self,**kwargs):
super(User,self).__init__(**kwargs)
if self.role is None:
if self.email ==current_app.config['CMDB_ADMIN']:
self.role =Role.query.filter_by(permissions=0xff).first()
if self.role ==None:
self.role =Role.query.filter_by(default=True).first()
def __repr__(self):
'
到这里简单的基于角色的权限控制就完成了。接下来就是比较简单的角色认证了。由于是自学不久,有不足之处希望大家多多指点。
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
本文标题:Flask实现基于角色的访问控制(RBAC)-创新互联
当前地址:http://scyanting.com/article/dhpjps.html