You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 08:24:02