必须同时启用租户上下文注入、数据库行级安全策略和rbac角色绑定三层机制:开启multi_tenancy_enabled为true,实现x-tenant-id/jwt解析;为含tenant_id表启用rls策略;建立viewer→editor→owner→tenantadmin继承链并绑定租户角色。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

要在Dify中真正实现租户间数据不互通、权限不越界、资源不争抢,必须同时激活租户上下文注入、数据库行级安全策略和RBAC角色绑定三层机制,缺一不可。
启用多租户隔离开关并配置注入源
打开 dify/config.py,将 MULTI_TENANCY_ENABLED 设为 【True】;该值为 False 时所有后续配置均被忽略。
在同文件中定义 get_current_tenant_id() 函数,优先从请求头 X-Tenant-ID 提取,无则回退解析 JWT 中的 tenant_id 或 organization_id 字段。
重启 Dify 服务使配置生效——这一步不可跳过,热重载不触发租户上下文初始化流程。
配置数据库行级安全策略(PostgreSQL)
方法一:手动为关键表启用 RLS 并绑定策略
以 conversations 表为例,执行 SQL:
ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;
CREATE POLICY tenant_isolation_policy ON conversations USING (tenant_id = current_setting('app.current_tenant', true)::UUID);
注意:必须对 apps、messages、datasets 等所有含 tenant_id 字段的核心表重复执行这两条语句,漏掉任意一张表都会造成该表数据裸奔。
方法二:使用迁移脚本批量处理(推荐)
在 migrations/ 下新增 V202606011000_add_rls_to_core_tables.py,调用 SQLAlchemy 的 execute() 批量执行 RLS 启用与策略创建逻辑,避免人工遗漏。
构建租户-角色-权限三级绑定链
第一步:在 Admin UI「系统设置 → 角色管理」中确认内置角色继承关系已建立:
Viewer → Editor → Owner → TenantAdmin,每一级都必须显式勾选“继承上级权限”,否则权限不会自动叠加。
第二步:通过 PostgreSQL 执行租户级角色绑定初始化:
INSERT INTO tenant_role_bindings (tenant_id, role_id, created_at)
SELECT t.id, r.id, NOW()
FROM tenants t CROSS JOIN roles r
WHERE r.name IN ('Viewer', 'Editor') AND t.status = 'active';
这一步将为所有激活租户自动分配基础角色,避免新租户注册后无默认权限导致白屏。
第三步:为每个租户单独配置资源配额(可选但强烈建议)
调用 Dify 配额管理 API,传入 JSON 载荷指定该租户的 max_apps、rate_limit 和 gpu_hours,不配置即沿用全局默认值,存在资源挤占风险。
验证租户上下文是否全程透传
启动调试模式,在任意 API 控制器中打印 request.context.get("tenant_id"),确认其非空且与请求头一致。
在数据库查询日志中检查实际执行的 SQL 是否自动包含 WHERE tenant_id = 'xxx' 条件——若未出现,说明中间件未生效或 RLS 策略未绑定成功。
用两个不同租户的 Token 分别调用 GET /v1/apps,比对返回列表内容是否完全隔离,无任何交集。











