用户与租户管理
用户与租户管理
相关源文件
本章引用的主要源码文件:
api/db/__init__.pyapi/db/db_models.pyapi/db/services/dialog_service.pyapi/db/services/document_service.pyapi/db/services/file_service.pyapi/db/services/knowledgebase_service.pyapi/db/services/llm_service.pyapi/db/services/task_service.pyapi/db/services/user_service.pyrag/nlp/search.pyrag/raptor.pyrag/svr/task_executor.pyweb/src/constants/setting.tsweb/src/pages/user-setting/constants.tsxweb/src/pages/user-setting/index.tsxweb/src/pages/user-setting/mcp/edit-mcp-dialog.tsxweb/src/pages/user-setting/mcp/index.tsxweb/src/pages/user-setting/mcp/tool-card.tsxweb/src/pages/user-setting/profile/index.tsxweb/src/pages/user-setting/setting-model/components/modal-card.tsxweb/src/pages/user-setting/setting-model/components/system-setting.tsxweb/src/pages/user-setting/setting-model/components/un-add-model.tsxweb/src/pages/user-setting/setting-model/components/used-model.tsxweb/src/pages/user-setting/setting-team/hooks.tsweb/src/pages/user-setting/setting-team/index.tsxweb/src/pages/user-setting/setting-team/tenant-table.tsxweb/src/pages/user-setting/setting-team/user-table.tsxweb/src/pages/user-setting/sidebar/index.tsx
目的与范围
本文档描述 RAGFlow 的用户与租户管理系统,涵盖用户注册、认证方式(密码、OAuth、API 令牌)以及提供工作空间隔离的多租户架构。文档详细说明了系统如何初始化新工作空间以及如何在不同的租户之间保持隔离。该系统构建在健壮的服务层之上,负责处理用户生命周期、租户特定的模型配置以及基于权限的资源访问。
多租户架构
RAGFlow 实现了多租户系统,每个用户可以属于多个租户(工作空间)。每个租户作为一个独立的工作空间运行,拥有自己的资源、配置和访问控制。
实体关系
多租户隔离:每个租户拥有自己独立的资源命名空间。UserTenant 表跟踪哪些用户可以访问哪些租户以及他们的角色 api/db/db_models.py:25-25。角色定义在 UserTenantRole 枚举中 api/db/__init__.py:21-25。系统通过在 DialogService api/db/services/dialog_service.py:142-142 和 DocumentService api/db/services/document_service.py:118-118 等服务中使用 tenant_id 过滤查询来强制实现隔离。
来源:api/db/db_models.py:25-25, api/db/__init__.py:21-25, api/db/services/dialog_service.py:142-142, api/db/services/document_service.py:118-118
用户注册与初始化
用户注册会创建一个完整的工作空间环境。这个过程涉及多个资源的初始化,包括创建默认租户以及将系统级大语言模型(LLM)映射到该租户。
注册与初始化流程
原子注册组件:
- 用户记录:存储个人资料和哈希凭证。
UserService.save使用generate_password_hash处理密码哈希api/db/services/user_service.py:112-127。 - 租户记录:每个新用户会被分配一个唯一的
tenant_id,并在Tenant表中创建对应的条目api/db/services/user_service.py:184-196。 - UserTenant 关联:建立用户在租户中的角色(例如
OWNER)api/db/services/user_service.py:195-195。 - 大语言模型(LLM)配置:使用
get_init_tenant_llm为租户初始化默认模型。该函数将全局模型工厂映射到租户的特定配置,设置api_key、api_base和max_tokensapi/db/services/llm_service.py:36-82。
来源:api/db/services/user_service.py:112-127, api/db/services/user_service.py:184-196, api/db/services/llm_service.py:36-82
认证系统
RAGFlow 支持传统的基于密码的登录、OAuth/OIDC 集成以及 API 令牌。
密码登录与会话管理
UserService 提供了凭证验证和账户管理的方法。
- 验证:
query_user验证电子邮件并使用check_password_hash检查密码哈希api/db/services/user_service.py:87-102。 - 密码管理:
update_user_password在提交到数据库之前重新哈希新密码api/db/services/user_service.py:148-155。 - 会话上下文:系统使用
AuthUserapi/db/db_models.py:28-28进行基于会话的身份管理。
OAuth 集成与一次性密码(OTP)
虽然标准密码登录很常见,但系统支持多因素流程和外部身份提供商。
- OAuth 集成:通过系统设置进行配置,允许外部提供商对用户进行身份验证并将其映射到内部的
User记录。 - OTP 流程:用于密码重置或敏感操作。系统生成一个带时间限制的令牌,在允许
update_user_password之前必须验证该令牌api/db/services/user_service.py:148-155。
来源:api/db/services/user_service.py:87-102, api/db/services/user_service.py:148-155, api/db/db_models.py:28-28
授权与身份
身份上下文与令牌验证
UserService.query 方法包含特定的逻辑来防止无效或恶意的令牌。
实现细节:
- 令牌消毒:系统拒绝空令牌、仅含空白字符的令牌或长度小于32个字符(标准 UUID 长度)的令牌,以防止绕过尝试
api/db/services/user_service.py:47-58。 - 失效处理:以
INVALID_开头的令牌(通常在注销时设置)会被自动拒绝api/db/services/user_service.py:61-63。 - 基于角色的访问:通过
is_admin执行管理检查,该函数验证User模型上的is_superuser标志api/db/services/user_service.py:159-162。
来源:api/db/services/user_service.py:47-66, api/db/services/user_service.py:159-162
租户配置与默认设置
大语言模型(LLM)与模型设置
每个租户维护自己的一组默认模型和配置,通过 LLMBundle 和 TenantLLMService 进行抽象。
- 租户默认值:
Tenant表存储默认模型 ID,包括llm_id(聊天)、embd_id(嵌入)、rerank_id(重排序)、asr_id(语音识别)和img2txt_id(视觉)api/db/services/user_service.py:185-194。 - 使用量跟踪:
LLMBundle作为一个包装器,跟踪令牌使用量。每次调用encode、similarity或describe时,都会触发TenantLLMService.increase_usage_by_id来增加租户的已消耗令牌数api/db/services/llm_service.py:111-112,api/db/services/llm_service.py:127-128,api/db/services/llm_service.py:141-142。 - 动态解析:
get_tenant_default_model_by_type在运行时解析租户的特定模型配置(API 密钥、基础 URL)api/db/joint_services/tenant_model_service.py:44-44。
来源:api/db/services/user_service.py:185-194, api/db/services/llm_service.py:111-142, api/db/joint_services/tenant_model_service.py:44-44