[Bug]: Knowledge base creators cannot access datasets created via upload or RAG Pipeline

启用 RBAC 的 Dify 自托管实例中,通过标准知识库首次上传( POST /console/api/datasets/init )或 RAG Pipeline DSL/YAML 导入( POST /console/api/datasets/rag/pipeline/dataset )创建知识库

快速结论:启用 RBAC 的 Dify 自托管实例中,通过标准知识库首次上传(POST /console/api/datasets/init)或 RAG Pipeline DSL/YAML 导入(POST /console/api/datasets/rag/pipeline/dataset)创建知识库时,创建请求本身返回成功,但创建者未被写入资源级 RBAC 白名单,导致创建后无法在列表看到该知识库,或打开时提示 [Bug]: Knowledge base creators cannot access datasets created via upload or RAG Pipeline。优先排查数据集创建路径是否缺少创建者访问策略绑定。

适用环境:Dify 版本 1.17.1;Self Hosted(Source)部署;已启用 RBAC;浏览器不限。

最快修复方案:暂无确认的一步修复方案。Issue 中提到的候选修复(在 create_empty_rag_pipeline_dataset 及 DSL 导入路径中、数据集创建后补调 enterprise_rbac_service.try_sync_creator_access_policy_member_bindings(...))来自讨论中的分析,并非 Issue 中已验证合并的修复,可优先尝试但需自行验证。

注意事项:该问题与 PR #42430 引入的 automatic_include_workspace_members=False 行为变更相关,改动涉及权限逻辑,勿在生产环境未经测试直接应用。相关 PR #42507 在 Issue 提交时处于 closed 状态,其修复是否被采纳尚未在本 Issue 中确认。

问题场景

在自托管 Dify 实例中启用 RBAC 后,以具备知识库创建和管理权限的工作区成员或编辑者身份,执行以下任一创建流程:

  • 场景 A:打开 Knowledge 页面创建标准知识库,上传第一个文档并完成创建流程,请求发往 POST /console/api/datasets/init
  • 场景 B:打开 RAG Pipeline 创建页面,通过导入 DSL/YAML 文件创建知识库,请求发往 POST /console/api/datasets/rag/pipeline/dataset

创建请求返回成功后,返回知识库列表或跳转后的知识库页面时,新知识库对创建者不可见或无法打开。

报错原文

[Bug]: Knowledge base creators cannot access datasets created via upload or RAG Pipeline

403 Forbidden
You do not have permission to access this dataset.

原因分析

根据 Issue 讨论中的分析,最可能的原因是 RAG Pipeline 路径跳过了创建者的 RBAC 绑定:

  • CreateEmptyRagPipelineDatasetApi.post 调用 DatasetService.create_empty_rag_pipeline_dataset 构建并提交 Dataset,但没有调用 try_sync_creator_access_policy_member_bindings——即把创建者加入 RBAC 白名单的辅助方法。
  • 该调用只存在于 DatasetService.create_empty_dataset,也就是普通 console POST /datasets 路径中。
  • 自 PR #42430 起,所有数据集创建路径都设置 automatic_include_workspace_members=False,工作区成员(包括创建者)不再被自动授予访问权限,必须显式加入白名单。console POST /datasets 在创建后通过创建者同步调用做了补偿;而 RAG Pipeline 空数据集和 DSL 导入处理器只调用了 DatasetAccess.replace_whitelist(automatic_include_workspace_members=False),从未绑定创建者,因此没有 RBAC 访问记录,访问自己的数据集时返回 403。

Issue 中同时提到 #42499 记录了同一回归(console 上传与 RAG Pipeline 创建路径在 #42430 之后丢失创建者访问权限),#39379 追踪了 RBAC 初始化在非主创建路径被跳过的更广泛问题。以上均为讨论中的推断性定位,并非本 Issue 中已验证并合并的结论。

环境排查

  • 确认 Dify 版本是否为 1.17.1
  • 确认部署方式为 Self Hosted(Source)。
  • 确认实例是否已启用 RBAC。
  • 确认执行操作的用户是否为工作区成员或编辑者,且具备知识库创建与管理权限。
  • 确认失败发生在哪种创建流程:标准知识库首次上传,还是 RAG Pipeline DSL/YAML 导入。
  • 对比同一实例中通过 console POST /datasets 创建的知识库是否可正常访问(用于区分为通用 RBAC 问题还是特定创建路径问题)。

解决步骤

  1. 先复现并记录失败路径:分别在标准知识库首次上传与 RAG Pipeline DSL/YAML 导入流程创建知识库,确认创建请求返回 200 / 201,但随后列表不可见或打开返回 403。
  2. 对比验证:在同一实例中通过 console POST /datasets 路径创建数据集,观察创建者是否正常拥有访问权限,以确认问题是否仅出现在 RAG Pipeline 相关创建路径。
  3. 定位相关代码路径:检查 create_empty_rag_pipeline_dataset 及 DSL 导入处理器在创建数据集后是否调用了 try_sync_creator_access_policy_member_bindings,并与 create_empty_dataset 中的实现对比。
  4. 可优先尝试的修复方向(Issue 讨论中提出、未经本 Issue 验证合并):在 create_empty_rag_pipeline_dataset 和 DSL 导入路径中、数据集创建完成后立即补调 enterprise_rbac_service.try_sync_creator_access_policy_member_bindings(tenant_id, current_user.id, RBACResourceType.DATASET, dataset.id),与 create_empty_dataset 保持一致。
  5. 若选择采纳上述修复,需跟随 PR #42507 的评审状态;该 PR 在 Issue 提交时为 closed,Issue 请求重新打开并评审合并,实际是否可用取决于项目维护者的合入决定。
  6. 临时规避:在权限管理侧手动为创建者补充该数据集的资源级访问绑定,使创建者可以立刻访问已创建的知识库(具体入口取决于部署版本的 RBAC 管理界面)。

验证方法

应用修复(或手动补充访问绑定)后,重新执行标准知识库首次上传与 RAG Pipeline DSL/YAML 导入两条创建流程:确认新知识库立即出现在知识库列表中,且创建者可以打开数据集详情及文档相关页面,不再返回 403 Forbidden。同时确认其他未被显式授权的成员仍无法访问该数据集,以保证 automatic_include_workspace_members=False 的预期行为未被破坏。

参考来源

langgenius/dify #42836

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 25208

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注