本文档介绍了 Dify 的账号与租户管理系统,该系统负责平台内的用户身份验证、工作区(租户)管理和用户权限。该系统提供全面的用户身份管理、多工作区支持和基于角色的访问控制。
账号与租户管理系统为 Dify 提供了多租户用户身份和访问控制。它包含三个主要服务类:
AccountService - 用户身份验证、账号生命周期、安全功能TenantService - 工作区管理、成员角色、权限RegisterService - 账号注册、邀请、设置流程该系统实现了全面的身份验证,包括基于密码的登录、OAuth 提供商(GitHub/Google)、邮箱验证码验证以及带刷新令牌轮换的 JWT 令牌管理。
来源
该系统围绕以下主要实体构建:
来源
账号创建流程通过特定的服务方法和 API 端点进行
| 注册类型 | 入口点 | 服务方法 | 主要功能 |
|---|---|---|---|
| 标准 | 不适用(仅云端) | RegisterService.register() | 密码哈希、工作区创建 |
| OAuth | /oauth/login/<provider> | RegisterService.register() | GitHub/Google 集成 |
| 邀请 | /workspaces/current/members/invite-email | RegisterService.invite_new_member() | 邮箱令牌、角色分配 |
| 设置 | /setup | RegisterService.setup() | 首个管理员账号 |
来源
AccountService 通过特定的 API 端点提供了多种身份验证机制。
| 身份验证类型 | API 端点 | 服务方法 | 令牌存储 |
|---|---|---|---|
| 密码登录 | POST /login | AccountService.authenticate() | JWT + Redis 刷新令牌 |
| 邮箱验证码 | POST /email-code-login | AccountService.get_email_code_login_data() | JWT + Redis 刷新令牌 |
| OAuth | GET /oauth/authorize/<provider> | AccountService.login() | JWT + Redis 刷新令牌 |
| 令牌刷新 | POST /refresh-token | AccountService.refresh_token() | 新的 JWT + 轮换的刷新令牌 |
密码认证流程
JWT 令牌生成
刷新令牌管理
来源
该系统实现了多项安全功能:
来源
Dify 中的租户代表工作区,其中包含应用程序、数据集和模型提供商等资源。一个用户可以属于多个具有不同角色的租户,但一次只能有一个活动租户。
租户可以被创建
TenantService 类负责租户的创建和管理。
当创建租户时,会生成一对 RSA 密钥用于安全操作。
来源
Dify 通过 TenantAccountJoin 表实现租户内的基于角色的访问控制,该表定义了账号与租户之间的关系。每个关联都有一个与之关联的角色。
来源
用户可以属于多个租户并切换。系统会跟踪每个用户的当前活动租户。
当用户登录时,系统会加载他们当前的租户。
来源
成员邀请系统通过结构化的邀请流程处理新团队成员的创建。
| 端点 | 控制器类 | 服务方法 | 目的 |
|---|---|---|---|
POST /workspaces/current/members/invite-email | MemberInviteEmailApi | RegisterService.invite_new_member() | 发送邀请 |
DELETE /workspaces/current/members/<member_id> | MemberCancelInviteApi | TenantService.remove_member_from_tenant() | 移除成员 |
PUT /workspaces/current/members/<member_id>/update-role | MemberUpdateRoleApi | TenantService.update_member_role() | 更改角色 |
来源
工作区管理员可以更新现有成员的角色。
在更改所有者角色时,系统确保始终只有一个所有者。
来源
工作区管理员可以从租户中移除成员
系统在允许移除成员之前会检查权限
来源
来源
来源
来源
系统实施速率限制以防止滥用
来源
系统使用两种类型的令牌
来源
Dify 支持账户删除,并附带验证流程
来源
账户和租户管理系统集成了 Dify 的各种其他组件
这种集成确保 Dify 中的所有资源都按租户正确隔离,并在整个应用程序中执行适当的访问控制。
来源