菜单

账号与租户管理

相关源文件

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

系统概览

账号与租户管理系统为 Dify 提供了多租户用户身份和访问控制。它包含三个主要服务类:

  1. AccountService - 用户身份验证、账号生命周期、安全功能
  2. TenantService - 工作区管理、成员角色、权限
  3. RegisterService - 账号注册、邀请、设置流程

该系统实现了全面的身份验证,包括基于密码的登录、OAuth 提供商(GitHub/Google)、邮箱验证码验证以及带刷新令牌轮换的 JWT 令牌管理。

核心架构

来源

数据模型

该系统围绕以下主要实体构建:

来源

账号管理

账号创建与注册

账号创建流程通过特定的服务方法和 API 端点进行

注册类型入口点服务方法主要功能
标准不适用(仅云端)RegisterService.register()密码哈希、工作区创建
OAuth/oauth/login/<provider>RegisterService.register()GitHub/Google 集成
邀请/workspaces/current/members/invite-emailRegisterService.invite_new_member()邮箱令牌、角色分配
设置/setupRegisterService.setup()首个管理员账号

账号注册流程

来源

认证方法

AccountService 通过特定的 API 端点提供了多种身份验证机制。

身份验证类型API 端点服务方法令牌存储
密码登录POST /loginAccountService.authenticate()JWT + Redis 刷新令牌
邮箱验证码POST /email-code-loginAccountService.get_email_code_login_data()JWT + Redis 刷新令牌
OAuthGET /oauth/authorize/<provider>AccountService.login()JWT + Redis 刷新令牌
令牌刷新POST /refresh-tokenAccountService.refresh_token()新的 JWT + 轮换的刷新令牌

身份验证实现

密码认证流程

JWT 令牌生成

刷新令牌管理

来源

账号安全功能

该系统实现了多项安全功能:

  1. 密码哈希 - 使用带盐值的密码哈希
  2. 速率限制 - 限制登录尝试和密码重置请求
  3. IP 地址限制 - 限制 IP 地址发送邮件
  4. 令牌过期 - JWT 令牌在配置时间后过期
  5. 刷新令牌轮换 - 刷新时生成新令牌以提高安全性

来源

租户(工作区)管理

Dify 中的租户代表工作区,其中包含应用程序、数据集和模型提供商等资源。一个用户可以属于多个具有不同角色的租户,但一次只能有一个活动租户。

租户创建

租户可以被创建

  1. 在账号创建过程中自动创建(默认工作区)
  2. 由具有适当权限的用户手动创建

TenantService 类负责租户的创建和管理。

当创建租户时,会生成一对 RSA 密钥用于安全操作。

来源

基于角色的访问控制

Dify 通过 TenantAccountJoin 表实现租户内的基于角色的访问控制,该表定义了账号与租户之间的关系。每个关联都有一个与之关联的角色。

  • Owner - 完全的管理控制权
  • Admin - 可以管理大多数资源,但不能删除工作区
  • Normal - 普通用户,权限有限
  • Dataset Operator - 用于数据集管理的特殊角色

来源

租户切换

用户可以属于多个租户并切换。系统会跟踪每个用户的当前活动租户。

当用户登录时,系统会加载他们当前的租户。

来源

成员管理

成员邀请系统

成员邀请系统通过结构化的邀请流程处理新团队成员的创建。

邀请 API 端点

端点控制器类服务方法目的
POST /workspaces/current/members/invite-emailMemberInviteEmailApiRegisterService.invite_new_member()发送邀请
DELETE /workspaces/current/members/<member_id>MemberCancelInviteApiTenantService.remove_member_from_tenant()移除成员
PUT /workspaces/current/members/<member_id>/update-roleMemberUpdateRoleApiTenantService.update_member_role()更改角色

成员邀请流程

来源

管理成员角色

工作区管理员可以更新现有成员的角色。

在更改所有者角色时,系统确保始终只有一个所有者。

来源

移除成员

工作区管理员可以从租户中移除成员

系统在允许移除成员之前会检查权限

来源

认证流程

登录和令牌管理流程

来源

OAuth 认证流程

来源

密码重置流程

来源

安全考量

速率限制

系统实施速率限制以防止滥用

  1. 登录尝试 - 限制错误密码尝试次数
  2. 密码重置 - 限制密码重置邮件发送次数
  3. 邮件验证码登录 - 限制验证码邮件发送次数
  4. 基于 IP 的限制 - 限制通过 IP 地址发送邮件

来源

令牌管理

系统使用两种类型的令牌

  1. 访问令牌 - 用于 API 身份验证的短期 JWT 令牌
  2. 刷新令牌 - 存储在 Redis 中用于获取新访问令牌的长期令牌

来源

账户删除

Dify 支持账户删除,并附带验证流程

  1. 用户请求删除账户
  2. 系统通过电子邮件发送验证码
  3. 用户使用验证码确认
  4. 账户已排队等待删除

来源

与其他系统集成

账户和租户管理系统集成了 Dify 的各种其他组件

  1. 模型提供商系统 - 使用租户上下文进行 API 密钥管理
  2. RAG 知识系统 - 根据租户成员身份控制数据集的访问权限
  3. 对话系统 - 将对话与用户和租户关联
  4. 工作流系统 - 根据租户角色强制执行权限

这种集成确保 Dify 中的所有资源都按租户正确隔离,并在整个应用程序中执行适当的访问控制。

来源