security(api): GET /data-source/integrates missing admin and RBAC permission decorators

该报错发生在启用了 RBAC 权限控制的 Dify 工作区中,普通工作区成员(非 Admin/Owner 且无 CREDENTIAL_MANAGE 权限)可以通过 GET /data-source/integrates 接口查看所有数据源 OAuth 集成信息,因为该接口缺少管理员及 RBAC 权限

快速结论:该报错发生在启用了 RBAC 权限控制的 Dify 工作区中,普通工作区成员(非 Admin/Owner 且无 CREDENTIAL_MANAGE 权限)可以通过 GET /data-source/integrates 接口查看所有数据源 OAuth 集成信息,因为该接口缺少管理员及 RBAC 权限装饰器。优先排查 api/controllers/console/datasets/data_source.pyDataSourceApi.get 方法的装饰器是否完整。

适用环境:Dify 1.14.2(main 分支),Docker 自托管部署,启用了 RBAC 权限控制的工作区。

最快修复方案:暂无确认的一步修复方案。Issue 中提出了修复建议:在 DataSourceApi.get 方法上添加 @is_admin_or_owner_required@rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.CREDENTIAL_MANAGE, resource_required=False) 两个装饰器,与同类的 PATCH 方法保持一致。

注意事项:该修复建议基于 Issue 中的代码分析,属于可行方案但尚未在 Issue 中明确标注已通过合并 PR 验证。装饰器顺序需与 patch 方法保持一致,即放在 @account_initialization_required 之前。

问题场景

用户在启用了 RBAC 权限控制的 Dify 工作区中,以普通工作区成员身份(非 Admin/Owner 角色,且无 CREDENTIAL_MANAGE RBAC 权限)登录后,发送 GET /console/api/data-source/integrates 请求。请求竟然成功返回了工作区所有数据源集成信息及其来源详情(DataSourceOauthBinding),而向同一端点发送 PATCH 请求时却会正确返回 403 Forbidden。问题出现在 Dify 的 API 控制器文件中。

报错原文

security(api): GET /data-source/integrates missing admin and RBAC permission decorators

原因分析

可能原因:在 api/controllers/console/datasets/data_source.py 文件中,DataSourceApi.get 方法(约第 140 行)只包含了以下装饰器:

  • @setup_required
  • @login_required
  • @account_initialization_required
  • @with_current_tenant_id

缺少了 @is_admin_or_owner_required@rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.CREDENTIAL_MANAGE, resource_required=False) 两个权限装饰器。而在同一个类中的 DataSourceApi.patch 方法(约第 191 行)则正确地同时执行了这两个权限检查。根本原因是在为 DataSourceApi.patch 添加 RBAC 装饰器时,同类的 get 方法被遗漏了。

环境排查

  • Dify 版本:1.14.2(main 分支)
  • 部署方式:Docker 自托管(Self Hosted)
  • 工作区需启用 RBAC 权限控制
  • 涉及文件:api/controllers/console/datasets/data_source.py
  • 相关权限:CREDENTIAL_MANAGE 的 RBAC 权限,RBACResourceScope.WORKSPACE 资源范围

解决步骤

  1. 打开文件 api/controllers/console/datasets/data_source.py,定位到 DataSourceApi.get 方法(约第 140 行)。
  2. 按照 Issue 中建议的装饰器顺序,在现有装饰器基础上添加两个权限装饰器(放在 @account_initialization_required 之前):
    @is_admin_or_owner_required
    @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.CREDENTIAL_MANAGE, resource_required=False)
  3. 确认所需的导入(import)已经存在于文件顶部(约第 35-45 行),无需额外添加。
  4. 如果确认修改有效,可提交 PR 到 Dify 仓库;文件中的导入项已完整,这属于一行变更的修复。

验证方法

修复后,以普通工作区成员身份(非 Admin/Owner 且无 CREDENTIAL_MANAGE 权限)发送 GET /console/api/data-source/integrates 请求,应返回 403 Forbidden,与 PATCH 方法的响应一致;使用 Admin 或具备相应 RBAC 权限的用户请求则仍能正常访问。

参考来源

langgenius/dify #41079

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19681

发表回复

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