本文档介绍 Dify 的账户与租户管理系统,该系统负责平台内的用户认证、工作区(租户)管理及用户权限控制。系统提供完整的用户身份管理、多工作区支持和基于角色的访问控制。

系统概述

账户与租户管理系统是 Dify 的核心组件,主要管理:

  • 用户账户:注册、认证、资料管理
  • 工作区(租户):包含独立成员和资源的组织单元
  • 成员与角色:工作区内的基于角色访问控制(RBAC)
  • 认证流程:支持密码、邮箱验证码、OAuth 等多种认证方式

该系统通过提供身份和访问控制,与 RAG 知识系统(参见 RAG 知识系统)、对话系统(参见 对话系统)等组件集成。

架构图

数据模型

系统基于以下核心实体构建:

账户管理

账户创建与注册

Dify 支持多种账户创建方式:

  • 标准注册:邮箱 / 密码注册
  • OAuth 注册:通过 GitHub、Google 等第三方登录
  • 邀请注册:受邀加入工作区时创建
  • 初始化注册:系统首次安装时创建首个用户

账户创建由 AccountServiceRegisterService 处理,核心逻辑包括密码哈希处理和默认设置:

认证方法

支持以下认证方式:

  • 密码登录:传统邮箱 / 密码认证
  • 邮箱验证码:发送一次性验证码到邮箱
  • OAuth 认证:集成 GitHub、Google 等第三方登录
  • 令牌认证:使用 JWT 令牌进行 API 访问

密码认证流程

account = AccountService.authenticate(email, password)  # 验证凭证  
token_pair = AccountService.login(account, ip_address)    # 生成访问令牌和刷新令牌  

JWT token管理

access_token = AccountService.get_account_jwt_token(account)
refresh_token = _generate_refresh_token()
AccountService._store_refresh_token(refresh_token, account.id)
账户安全特性

系统实现多项安全机制:

  • 密码哈希:使用加盐哈希(Salted Hashing)存储密码
  • 速率限制:限制登录尝试和密码重置请求频率
  • IP 限制:按 IP 地址限制邮箱发送频率
  • 令牌过期:JWT 访问令牌按配置时间过期
  • 刷新令牌轮换:每次刷新生成新令牌,增强安全性

租户(工作区)管理

租户创建

租户是包含应用、数据集、模型提供方等资源的组织单元,创建方式:

  • 自动创建:账户注册时生成默认租户
  • 手动创建:有权限用户通过界面或 API 创建

TenantService 处理租户创建,并生成 RSA 密钥对用于安全操作:

tenant = TenantService.create_tenant(name)
TenantService.create_tenant_member(tenant, account, role="owner")  # 添加所有者 

tenant.encrypt_public_key = generate_key_pair(tenant.id)  # rsa密钥
基于角色的访问控制(RBAC)

通过 TenantAccountJoin 表定义账户在租户内的角色:

角色 权限描述
所有者Owner 完全管理权限,可删除工作区
管理员Manager 管理大部分资源,但不可删除工作区
普通用户Normal 有限权限,仅能使用分配的资源
数据集操作员Dataset Operator 专门管理数据集的角色

租户切换

用户可加入多个租户并切换活跃租户:

TenantService.switch_tenant(account, target_tenant_id)  # 切换当前租户  

# 登录时加载当前租户  
current_tenant = TenantAccountJoin.query.filter_by(account_id=account.id, current=True).first()  
if current_tenant:
    account.current_tenant_id = current_tenant.tenant_id

成员管理

邀请成员

工作区管理员可通过以下步骤邀请新成员:

  1. 生成邀请令牌
  2. 发送包含令牌的邀请邮件
  3. 若用户不存在,创建待激活账户
  4. 接受邀请时分配角色

角色管理

管理员可更新成员角色:

TenantService.update_member_role(tenant, member, new_role, operator)

更换所有者时确保至少保留一个所有者:

if new_role == "owner":
    # Find the current owner and change their role to 'admin'
    current_owner_join = TenantAccountJoin.query.filter_by(tenant_id=tenant.id, role="owner").first()
    current_owner_join.role = "admin"
移除成员

管理员可移除成员,移除前检查操作权限:

TenantService.remove_member_from_tenant(tenant, account, operator)

TenantService.check_member_permission(tenant, operator, account, "remove")  # 权限校验  

认证流程

登录流程
  1. 用户提交邮箱 / 密码,调用 authenticate 验证凭证
  2. 生成 JWT 访问令牌和刷新令牌
  3. 刷新令牌存储在 Redis,访问令牌用于 API 请求
  4. 令牌过期时,通过 POST /refresh-token 生成新令牌

OAuth 认证流程
  1. 用户访问 /oauth/login/{provider},重定向到第三方认证页面
  2. 授权后回调,通过授权码换取访问令牌和用户信息
  3. 关联已有账户或创建新账户,生成默认租户并登录

密码重置流程
  1. 用户提交邮箱,发送包含重置令牌的邮件
  2. 验证令牌和验证码,设置新密码
  3. 令牌使用后失效,确保单次使用

安全考虑

速率限制
  • 登录尝试:限制错误密码尝试次数(默认 5 次 / 分钟)
  • 密码重置:限制邮箱发送频率,防止恶意攻击
  • IP 限制:按 IP 地址限制验证码邮件发送频率
reset_password_rate_limiter = RateLimiter(prefix="reset_password_rate_limit", max_attempts=1, time_window=60 * 1)
email_code_login_rate_limiter = RateLimiter(prefix="email_code_login_rate_limit", max_attempts=1, time_window=60 * 1)
LOGIN_MAX_ERROR_LIMITS = 5
FORGOT_PASSWORD_MAX_ERROR_LIMITS = 5
令牌管理
  • 访问令牌:短期有效(JWT),用于 API 认证
  • 刷新令牌:长期有效,存储在 Redis,用于获取新访问令牌
REFRESH_TOKEN_PREFIX = "refresh_token:"
ACCOUNT_REFRESH_TOKEN_PREFIX = "account_refresh_token:"
REFRESH_TOKEN_EXPIRY = timedelta(days=dify_config.REFRESH_TOKEN_EXPIRE_DAYS)

账户删除

Dify 支持通过验证流程删除账户:

  1. 用户请求删除账户
  2. 系统通过电子邮件发送验证码
  3. 用户使用验证码确认删除
  4. 账户进入删除队列
# Generate verification code
code = "".join([str(random.randint(0, 9)) for _ in range(6)])
token = TokenManager.generate_token(account=account, token_type="account_deletion", additional_data={"code": code})

# Delete account
delete_account_task.delay(account.id)

与其他系统的集成

账户与租户系统与 Dify 其他组件深度集成:

  • 模型提供方系统:基于租户上下文管理 API 密钥
  • RAG 知识系统:按租户权限控制数据集访问
  • 对话系统:关联对话记录与用户和租户
  • 工作流系统:基于租户角色实施权限控制

通过这种集成,确保所有资源按租户隔离,并在整个平台内实施统一的访问控制。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐