FLASK(9)-用户角色
角色在数据库中的表示
创建一个role表
app/models.py: 角色的权限
class Role(db.Model):
__tablename__ = 'roles'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String, unique=True)
default = db.Column(db.Boolean, default=False, index=True) # 默认为False
permissions = db.Column(db.Integer) #表示位标志
users = db.relationship('User', backref='role', lazy='dynamic')
- permissions表示位标志,其值为整数。各操作对应一个位位置,能执行则被标识为1.
关注: 0b00000001
发表评论: 0b00000010
写文章: 0b00000100
管理别人的评论: 0b00001000
管理员权限: 0b00010000
- 操作权限用八位表示,我们只用了5位。
app/models.py: 权限常量
class Permisson:
FOLLOW = 0X01
COMMENT = 0X02
WRITE_ARTICLES = 0X04
MODERATE_COMMENTS = 0X08
ADMINISTOR = 0X80
角色
匿名:0b00000000 未登录的用户,只能阅读
用户:0b00000111 已登陆用户,发布文章、发表评论、关注其他用户
协管员:0b00001111 增加审查不当评论权限
管理员:0b11111111所有权限
- 使用权限组织角色,这种做法让以后添加新角色时只用组合权限即可。
手动添加角色易出错,自动添加。
app/models.py: 在数据库中创建角色
class Role(db.Model):
#..
@staticmethod
def insert_roles():
roles = {
'User': (Permission.FOLLOW | Permission.COMMENT | Permission.WRITE_ARTICLES, True)
'Moderator': (Permission.FOLLOW | Permission.COMMENT | Permission.WRITE_ARTICLES | Permission.MODERATOR_COMMENTS, False)
'Administor': (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()
赋予角色
app/models.py: 定义默认的用户角色
class User(UserMixin, db.Model):
#..
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
if self.role is None: # 基类未定义role属性
if self.email == current_app.config['FLASKY_ADMIN']
self.role = Role.query.filter_by(permissions=0xff).first()
if self.role is None:
slef.role = Role.query.filter_by(default=True).first() #默认用户user
角色验证
app/models.py: 检查用户是否有指定权限
class User(UserMixin, db.model):
#..
def can(self, perssion):
return self.role is not None and (self.perssions & perssion) == perssion
def is_administrator(self):
return self.can(Perssion.ADMINISTER)
class AnonymousUser(AnonymousUserMixin):
def can(self, perssion):
return False
def is_administrator(self):
return False
login_manager.anonymous_user = AnonymousUser
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术