工作空间与成员管理
工作区与成员管理
相关源文件
本章引用的主要源码文件:
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 建立的多对多关系构建:
来源: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 类提供了工作区管理操作:
来源: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
成员邀请系统
邀请流程架构
来源: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
所有者转移系统
所有者转移架构
来源: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