工作空间与成员管理(中文译文)
原始 DeepWiki 页面:https://deepwiki.com/langgenius/dify/8.4-workspace-and-member-management
翻译时间:2026-05-27T08:44:35.751Z
翻译模型:deepseek-chat
原文字符数:18025
项目:Dify (dify)
---
工作区与成员管理
相关源文件
以下文件用于生成此维基页面:
api/controllers/console/auth/data_source_oauth.pyapi/controllers/console/auth/email_register.pyapi/controllers/console/auth/error.pyapi/controllers/console/auth/forgot_password.pyapi/controllers/console/auth/login.pyapi/controllers/console/auth/oauth.pyapi/controllers/console/explore/installed_app.pyapi/controllers/console/workspace/account.pyapi/controllers/console/workspace/members.pyapi/controllers/console/workspace/model_providers.pyapi/controllers/console/workspace/models.pyapi/controllers/console/workspace/plugin.pyapi/controllers/console/workspace/workspace.pyapi/libs/oauth.pyapi/libs/oauth_data_source.pyapi/schedule/mail_clean_document_notify_task.pyapi/services/account_service.pyapi/templates/change_mail_confirm_old_template_zh-CN.htmlapi/templates/transfer_workspace_owner_confirm_template_en-US.htmlapi/templates/without-brand/transfer_workspace_owner_confirm_template_en-US.htmlapi/tests/unit_tests/libs/test_oauth_clients.pyapi/tests/unit_tests/services/test_account_service.pyweb/app/components/base/file-icon/index.tsxweb/app/components/base/icons/src/public/files/index.tsweb/app/components/base/tag-input/index.tsxweb/app/components/datasets/create/assets/docx.svgweb/app/components/datasets/documents/style.module.cssweb/app/components/datasets/settings/permission-selector/index.tsxweb/app/components/header/account-setting/data-source-page-new/configure.tsxweb/app/components/header/account-setting/data-source-page-new/operator.tsxweb/app/components/header/account-setting/members-page/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/index.tsxweb/app/components/header/account-setting/members-page/invite-modal/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/invite-modal/role-selector.tsxweb/app/components/header/account-setting/members-page/invited-modal/index.tsxweb/app/components/header/account-setting/members-page/invited-modal/invitation-link.tsxweb/app/components/header/account-setting/members-page/operation/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/operation/index.tsxweb/app/components/header/account-setting/members-page/transfer-ownership-modal/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/transfer-ownership-modal/index.tsxweb/app/components/header/account-setting/members-page/transfer-ownership-modal/member-selector.tsxweb/app/components/header/account-setting/model-provider-page/model-auth/add-custom-model.tsxweb/app/components/header/account-setting/model-provider-page/model-auth/authorized/index.tsxweb/app/components/header/account-setting/model-provider-page/model-auth/credential-selector.tsxweb/app/components/header/account-setting/model-provider-page/model-parameter-modal/parameter-item.tsxweb/assets/docx.svg
本文档介绍了 Dify 中的工作区(租户)管理操作、成员生命周期管理以及基于许可证的功能限制。内容涵盖工作区的增删改查(CRUD)操作、成员邀请工作流、角色更新、成员移除、所有者转移,以及许可证/品牌配置如何控制工作区功能。
有关底层租户和账户数据模型的信息,请参见第 8.1 页。有关基于角色的权限实施,请参见第 8.3 页。有关认证机制,请参见第 8.2 页。
工作区数据模型
核心实体
工作区管理系统基于 Tenant(工作区)实体及其通过 TenantAccountJoin 与 Account 建立的多对多关系构建:
erDiagram
TENANT ||--o{ TENANT_ACCOUNT_JOIN : "拥有成员"
ACCOUNT ||--o{ TENANT_ACCOUNT_JOIN : "加入工作区"
TENANT ||--o{ APP : "拥有"
TENANT ||--o{ DATASET : "拥有"
TENANT {
uuid id 主键
string name
string status
json custom_config_dict
string encrypt_public_key
datetime created_at
}
TENANT_ACCOUNT_JOIN {
uuid id 主键
uuid tenant_id 外键
uuid account_id 外键
string role
datetime invited_by_account_id
boolean current
datetime created_at
}
ACCOUNT {
uuid id 主键
string email
string name
string status
string interface_language
uuid current_tenant_id
}
来源:api/models/account.py:36-45, api/models/account.py:330-370
工作区状态值
TenantStatus 枚举定义了工作区的状态:
| 状态 | 描述 |
|---|---|
NORMAL | 活跃工作区,功能完全正常 |
ARCHIVE | 已归档工作区,只读或受限访问 |
来源:api/models/account.py:45-45
成员角色
TenantAccountRole 枚举定义了具有层级权限的角色级别:
| 角色 | 权限 |
|---|---|
OWNER | 完全控制权,包括删除工作区、转移所有权、计费 |
ADMIN | 用户管理、应用/数据集创建和管理 |
EDITOR | 应用/数据集创建和编辑 |
NORMAL | 查看和使用应用/数据集 |
DATASET_OPERATOR | 仅管理数据集,不能管理应用 |
来源:api/models/account.py:43-43, api/controllers/console/workspace/members.py:32-32
工作区操作
工作区 CRUD 服务层
TenantService 类提供了工作区管理操作:
graph TD
TenantService["TenantService<br/>(account_service.py)"]
TenantService --> CreateTenant["create_tenant()<br/>创建新工作区"]
TenantService --> GetJoinTenants["get_join_tenants()<br/>列出用户的工作区"]
TenantService --> SwitchTenant["switch_tenant()<br/>切换活跃工作区"]
TenantService --> GetTenantMembers["get_tenant_members()<br/>列出工作区成员"]
TenantService --> CreateTenantMember["create_tenant_member()<br/>向工作区添加成员"]
TenantService --> RemoveMember["remove_member_from_tenant()<br/>移除成员"]
TenantService --> UpdateMemberRole["update_member_role()<br/>更改成员角色"]
TenantService --> IsOwner["is_owner()<br/>检查账户是否拥有工作区"]
CreateTenant --> DB[(TenantAccountJoin<br/>数据库)]
GetJoinTenants --> DB
SwitchTenant --> DB
GetTenantMembers --> DB
来源:api/services/account_service.py:987-1489
工作区列表 API
/workspaces 端点返回用户所属的所有工作区:
端点:GET /console/api/workspaces
请求流程:
- 从
current_account_with_tenant()获取当前用户和租户 IDapi/controllers/console/workspace/workspace.py:148-148。 - 调用
TenantService.get_join_tenants(current_user)获取成员关系api/controllers/console/workspace/workspace.py:149-149。 - 对于每个工作区,如果是 CLOUD 版本,则从
BillingService获取计费计划信息api/controllers/console/workspace/workspace.py:155-158。 - 返回包含计费计划信息的工作区列表
api/controllers/console/workspace/workspace.py:187-187。
来源:api/controllers/console/workspace/workspace.py:142-188
工作区切换
/workspaces/switch 端点用于更改用户的活跃工作区:
端点:POST /console/api/workspaces/switch
实现:调用 TenantService.switch_tenant(),该方法会更新 TenantAccountJoin 表中的 current 标志 api/services/account_service.py:1293-1324。
来源:api/controllers/console/workspace/workspace.py:246-255, api/services/account_service.py:1293-1324
成员邀请系统
邀请流程架构
sequenceDiagram
participant Inviter as "邀请者<br/>(所有者/管理员)"
participant API as "MemberInviteEmailApi<br/>(members.py)"
participant RegisterService as "RegisterService<br/>(account_service.py)"
participant TokenManager as "TokenManager<br/>(helper.py)"
participant MailTask as "send_invite_member_mail_task"
participant Invitee as "被邀请者"
Inviter->>API: POST /workspaces/current/members/invite-email
API->>API: check_workspace_member_invite_permission()
API->>RegisterService: invite_new_member()
RegisterService->>TokenManager: generate_token(type="invitation")
RegisterService->>MailTask: 发送邀请邮件
API-->>Inviter: invitation_results[]
Invitee->>Invitee: 点击链接: /activate?email=...&token=...
来源:api/controllers/console/workspace/members.py:99-169, api/services/account_service.py:1675-1837
邀请令牌生成
RegisterService.invite_new_member() 方法编排了邀请流程:
- 邮箱标准化:将被邀请者邮箱转换为小写
api/controllers/console/workspace/members.py:138-138。 - 权限检查:检查工作区成员邀请的权限
api/controllers/console/workspace/members.py:125-127。 - 限制检查:通过
FeatureService验证工作区成员上限api/controllers/console/workspace/members.py:132-135。 - 令牌生成:使用
TokenManager.generate_token()生成类型为"invitation"的令牌api/services/account_service.py:1711-1711。 - 邮件发送:将
send_invite_member_mail_taskCelery 任务加入队列api/services/account_service.py:1733-1733。
来源:api/services/account_service.py:1675-1837, api/controllers/console/workspace/members.py:99-169
许可证与权限检查
第一层 - 许可证/计划检查:通过 @cloud_edition_billing_resource_check("members") 装饰器实现 api/controllers/console/workspace/members.py:107-107。
第二层 - 工作区策略检查:通过 check_workspace_member_invite_permission(tenant_id) 实现 api/controllers/console/workspace/members.py:127-127。
来源:api/controllers/console/workspace/members.py:99-169, api/libs/workspace_permission.py:21-45
成员管理
列出工作区成员
端点:GET /console/api/workspaces/current/members
实现:TenantService.get_tenant_members(current_user.current_tenant) 获取与当前工作区关联的所有成员 api/controllers/console/workspace/members.py:93-93。
来源:api/controllers/console/workspace/members.py:81-96, api/services/account_service.py:1137-1157
更新成员角色
端点:PUT /console/api/workspaces/current/members/<member_id>/update-role
授权:只有工作区所有者和管理员可以更新角色。通过 TenantService.update_member_role() 中的内部逻辑强制执行 api/services/account_service.py:1235-1291。
来源:api/controllers/console/workspace/members.py:235-266, api/services/account_service.py:1235-1291
移除成员
端点:DELETE /console/api/workspaces/current/members/<member_id>
实现:TenantService.remove_member_from_tenant() 执行检查,确保用户不是移除自己,并且具有适当的权限 api/services/account_service.py:1192-1233。
来源:api/controllers/console/workspace/members.py:171-193, api/services/account_service.py:1192-1233
所有者转移系统
所有者转移架构
graph TD
Owner["当前所有者"]
SendAPI["SendOwnerTransferEmailApi<br/>(members.py)"]
CheckAPI["OwnerTransferCheckApi<br/>(members.py)"]
TransferAPI["OwnerTransferApi<br/>(members.py)"]
AccSvc["AccountService<br/>(account_service.py)"]
Owner -->|发起| SendAPI
SendAPI -->|生成令牌| AccSvc
AccSvc -->|邮件验证码| Owner
Owner -->|提交验证码| CheckAPI
CheckAPI -->|验证| AccSvc
AccSvc -->|新令牌| CheckAPI
CheckAPI -->|有效| Owner
Owner -->|最终转移| TransferAPI
TransferAPI -->|更新角色| AccSvc
来源:api/controllers/console/workspace/members.py:286-430, api/services/account_service.py:561-627
所有者转移速率限制
系统实现了多层速率限制,以防止滥用所有者转移流程:
| 速率限制 | 键 | 窗口 | 最大尝试次数 | 描述 |
|---|---|---|---|---|
| 邮件发送 | owner_transfer_rate_limit | 60 秒 | 1 | 限制验证邮件发送频率 api/services/account_service.py:133-133 |
| 验证码验证 | OWNER_TRANSFER_MAX_ERROR_LIMITS | 不适用 | 5 | 限制验证码错误尝试次数 api/services/account_service.py:138-138 |
来源:api/services/account_service.py:133-138, api/services/account_service.py:913-939
工作区自定义配置
自定义品牌设置
端点:POST /console/api/workspaces/custom-config
授权:需要 @cloud_edition_billing_resource_check("workspace_custom") 装饰器 api/controllers/console/workspace/workspace.py:254-254。
实现:更新 Tenant.custom_config_dict JSON 字段,包含品牌设置,如 remove_webapp_brand 和 replace_webapp_logo api/controllers/console/workspace/workspace.py:276-281。
来源:api/controllers/console/workspace/workspace.py:248-312
企业工作区权限
权限检查函数
workspace_permission.py 模块提供了与 EnterpriseService 集成的权限检查:
成员邀请权限: check_workspace_member_invite_permission(workspace_id) 验证当前工作区策略是否允许邀请 api/libs/workspace_permission.py:21-45。
所有者转移权限: check_workspace_owner_transfer_permission(workspace_id) 验证工作区是否允许所有权转移 api/libs/workspace_permission.py:47-74。
来源:api/libs/workspace_permission.py:21-74
工作区权限 API
端点:GET /console/api/workspaces/current/permission
授权:需要 @only_edition_enterprise 装饰器 api/controllers/console/workspace/workspace.py:338-338。
实现:调用 EnterpriseService.WorkspacePermissionService.get_permission(tenant_id) 获取特定的权限设置 api/controllers/console/workspace/workspace.py:357-357。
来源:api/controllers/console/workspace/workspace.py:335-361
与 OAuth 和激活的集成
带邀请令牌的 OAuth
OAuth 登录流程支持将邀请令牌作为状态参数传递:
实现:OAuthCallback.get() 检查 OAuth 状态中是否存在 invite_token。如果存在,则验证令牌并确保用户邮箱与邀请邮箱匹配,然后完成流程 api/controllers/console/auth/oauth.py:152-162。
来源:api/controllers/console/auth/oauth.py:109-162