多租户与安全
多租户与安全
相关源文件
本章引用的主要源码文件:
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/models/account.pyapi/models/api_based_extension.pyapi/models/dataset.pyapi/models/model.pyapi/models/provider.pyapi/models/source.pyapi/models/task.pyapi/models/tools.pyapi/models/web.pyapi/models/workflow.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/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/operation/__tests__/index.spec.tsxweb/app/components/header/account-setting/members-page/operation/index.tsx
本文档介绍 Dify 的多租户架构、认证机制、基于角色的访问控制(RBAC)系统以及安全特性。内容涵盖系统如何在工作空间(租户)之间隔离数据、管理用户认证和授权,以及实施安全策略。
有关具体部署配置和环境变量的信息,请参阅部署与运维。有关 API 认证和请求流程的详细信息,请参阅服务 API。
租户模型与工作空间隔离
Dify 通过 Tenant 模型实现严格的多租户架构,该模型代表一个工作空间。系统中的每个资源都通过 tenant_id 外键限定在某个租户范围内,从而确保工作空间之间的数据完全隔离。
租户实体结构
来源: api/models/account.py:19-25, api/models/account.py:87-116, api/models/model.py:32, api/models/dataset.py:178-179, api/models/workflow.py:187-188
数据隔离模式
隔离通过在数据库查询中始终包含 tenant_id 来强制执行。AccountService.load_user 函数确保用户登录时,其 current_tenant_id 根据 TenantAccountJoin 表正确设置,从而将所有后续请求限定到该特定工作空间。
来源: api/services/account_service.py:162-193, api/models/account.py:156-169
详细信息请参阅租户模型与资源隔离。
认证架构
Dify 支持多种认证方式,包括邮箱/密码、OAuth(Google/GitHub)和邮箱验证码(Magic Link)。
认证流程与令牌管理
来源: api/services/account_service.py:104-107, api/services/account_service.py:150-154, api/controllers/console/auth/login.py:158-167
安全令牌
- 访问令牌:用于 API 授权的短期 JWT,通过
set_access_token_to_cookie设置在 Cookie 中。 - 刷新令牌:存储在 Redis 中,前缀为
refresh_token:,用于签发新的访问令牌。 - CSRF 令牌:通过
generate_csrf_token生成并验证,以防止跨站请求伪造。
来源: api/services/account_service.py:110-112, api/services/account_service.py:150-154, api/controllers/console/auth/login.py:164-166
详细信息请参阅认证方式与流程。
基于角色的访问控制(RBAC)
权限由 TenantAccountRole 枚举管理,该枚举定义了工作空间内的访问层级。
角色层级
| 角色 | 枚举值 | 关键权限 |
|---|---|---|
| 所有者 | owner | 完全控制权、所有权转让、工作空间删除。 |
| 管理员 | admin | 成员管理、模型提供商配置。 |
| 编辑者 | editor | 创建和编辑应用、工作流和数据集。 |
| 数据集操作员 | dataset_operator | 专门访问知识库管理。 |
| 普通成员 | normal | 基本访问权限,通常为只读或受限执行。 |
来源: api/models/account.py:19-24, api/models/account.py:39-76, web/app/components/header/account-setting/members-page/index.tsx:28-34
权限检查
系统使用 TenantAccountRole 中的工具方法(如 is_privileged_role 或 is_editing_role)在控制器和服务层检查权限。
来源: api/models/account.py:38-76, api/controllers/console/workspace/members.py:115-122
详细信息请参阅基于角色的访问控制。
工作空间与成员管理
工作空间管理包括邀请成员、更新角色和转让所有权。
所有权转让流程
转让工作空间所有权是一个多步骤过程。它需要通过发送给当前所有者的验证码进行验证,并触发后台任务(如 send_owner_transfer_confirm_task)。
来源: api/services/account_service.py:74-78, api/controllers/console/workspace/members.py:48-60
成员邀请
管理员通过 RegisterService.invite_new_member 邀请新成员。这会生成一个邀请令牌,并触发 send_invite_member_mail_task。
来源: api/services/account_service.py:73, api/controllers/console/workspace/members.py:142-148
详细信息请参阅工作空间与成员管理。
账户生命周期管理
账户生命周期包括注册、激活、密码管理和删除。
生命周期事件
| 操作 | 代码实体 | 用途 |
|---|---|---|
| 注册 | RegisterService | 初始账户创建和邮箱验证。 |
| 激活 | AccountInitApi | 完成账户设置(时区/语言)。 |
| 密码重置 | AccountService | 通过 send_reset_password_mail_task 安全恢复。 |
| 删除 | delete_account_task | 通过 Celery 异步清理用户数据。 |
来源: api/services/account_service.py:66, api/services/account_service.py:79-83, api/controllers/console/workspace/account.py:250-252, api/controllers/console/auth/login.py:49
详细信息请参阅账户生命周期管理。
计费与功能限制
在云版本中,对成员席位、应用数量和向量存储等资源的访问受 BillingService 和 FeatureService 的限制。
功能检查
装饰器(如 cloud_edition_billing_resource_check)会拦截请求,以验证租户是否还有请求资源(例如"成员")的剩余配额。
来源: api/controllers/console/workspace/members.py:107, api/services/feature_service.py:54
安全工具
速率限制
Dify 使用基于 Redis 的 RateLimiter 来防止对登录和密码重置等敏感端点的暴力攻击。
来源: api/services/account_service.py:124-133, api/libs/helper.py:31
密码安全
密码在存储前使用 hash_password 进行哈希处理,并使用 compare_password 进行验证。请求中的敏感字段可以通过 decrypt_password_field 装饰器进行解密。
来源: api/services/account_service.py:34, api/controllers/console/auth/login.py:101, api/controllers/console/wraps.py:32