如何使用Flask-User创建账户持有人及受限权限子用户
基于Flask-User + MongoEngine实现主-子用户层级的方案
原生Flask-User的Role、UserRoles体系默认是全局权限设计,没有用户从属关联逻辑,需要通过扩展模型、自定义权限校验实现需求,具体步骤如下:
1. 扩展基础数据模型
新增企业主体模型、扩展原有用户/角色模型,添加从属关联字段:
from mongoengine import Document, StringField, ReferenceField, ListField, BooleanField from flask_user import UserMixin # 企业主体模型,归集同企业所有主/子账户 class Company(Document): company_name = StringField(required=True, unique=True) # 关联企业主账户(企业注册人) admin_user = ReferenceField('User', required=True) contact_info = StringField() # 扩展原Role模型,区分全局角色和企业自定义角色 class Role(Document): name = StringField(unique=True, required=True) # 全局角色标识:平台超级管理员等全局角色设为True,企业自定义角色设为False is_global = BooleanField(default=False) # 企业自定义角色关联所属企业,全局角色该字段为空 belong_company = ReferenceField('Company', null=True) # 存储权限标识列表,例:["document.view", "document.edit", "user.create"] permissions = ListField(StringField()) # 扩展原User模型,添加主-子关联字段 class User(Document, UserMixin): # 保留Flask-User必填原生字段 username = StringField(required=True, unique=True) password = StringField(required=True) email = StringField(required=True, unique=True) active = BooleanField(default=True) # 子用户关联父账户,企业主账户该字段为空 parent_user = ReferenceField('User', null=True) # 关联所属企业,同企业所有主/子账户关联同一个Company对象 belong_company = ReferenceField('Company', null=True) # 保留原UserRoles关联表,无需修改结构 class UserRoles(Document): user = ReferenceField(User, required=True) role = ReferenceField(Role, required=True)
2. 自定义权限校验逻辑
替换Flask-User原生的全局权限校验,增加两层校验规则:
- 归属校验:子用户仅能访问所属企业的资源,不可操作其他企业或父账户核心配置
- 权限校验:根据用户关联角色的
permissions字段判断是否具备操作权限
示例自定义权限校验装饰器:
from functools import wraps from flask import abort from flask_login import current_user def permission_required(permission_str): def decorator(f): @wraps(f) def decorated_function(*args, **kwargs): if not current_user.is_authenticated: abort(401) # 遍历用户所有角色匹配权限 has_permission = False user_roles = UserRoles.objects(user=current_user).all() for ur in user_roles: if permission_str in ur.role.permissions: has_permission = True break if not has_permission: abort(403) return f(*args, **kwargs) return decorated_function return decorator
3. 主账户创建子用户的业务约束
实现子用户创建功能时需遵守以下规则避免越权:
- 自动填充子用户的
belong_company为当前主账户所属企业,parent_user为当前登录的主账户 - 子用户仅能分配所属企业的自定义角色,不可分配全局角色
- 子用户的权限范围不得超过创建它的主账户的权限范围
兼容原生能力注意事项
不要修改Flask-User内置的登录、密码重置、邮箱验证等核心逻辑,所有扩展能力通过新增字段、自定义中间层实现,避免后续Flask-User版本升级出现兼容性问题。
内容的提问来源于stack exchange,提问作者ktcao
相关产品推荐
相关产品推荐

