security(api): GET /agent/{agent_id}/composer missing RBAC permission decorator

该报错是 Dify 1.17.0 中 Agent Composer 接口的 RBAC 权限校验缺失问题,当工作区已启用 RBAC 时,普通成员无需 AGENT_MANAGE 权限即可读取完整的 Agent 应用配置。优先排查 api/controllers/console/agent/compose

快速结论:该报错是 Dify 1.17.0 中 Agent Composer 接口的 RBAC 权限校验缺失问题,当工作区已启用 RBAC 时,普通成员无需 AGENT_MANAGE 权限即可读取完整的 Agent 应用配置。优先排查 api/controllers/console/agent/composer.pyAgentComposerApi.get 方法是否已添加 @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.AGENT_MANAGE, resource_required=False) 装饰器。

适用环境:Dify 1.17.0(main 分支,Docker 自托管版本),代码位于 api/controllers/console/agent/composer.py

最快修复方案:暂无确认的一步修复方案。该 Issue 已关闭但未提供已验证的补丁代码,建议将 AgentComposerApi.get 方法(约 517 行)添加与 put 方法(约 530 行)相同的 RBAC 权限装饰器,或等待官方在后续版本中修复。

注意事项:该问题不仅影响 AgentComposerApi.get,同文件中的多个只读接口(如 AgentComposerValidateApi.postAgentComposerCandidatesApi.getWorkflowAgentComposerApi.get 等)也存在类似权限校验缺失,建议在修复时一并检查。

问题场景

在启用了 RBAC(基于角色的访问控制)的 Dify 工作区中,使用普通工作区成员账号(不具备 AGENT_MANAGE 权限)调用 GET /console/api/agent/<agent_id>/composer 接口时,请求成功返回了完整的 Agent 应用构建器配置状态,包括系统提示词、工具、Agent 灵魂、模型等敏感配置信息。而对应的 PUT 方法(写入操作)则会正确返回 403 Forbidden,因为它在代码中强制使用了 @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.AGENT_MANAGE, resource_required=False) 装饰器。

报错原文

security(api): GET /agent/{agent_id}/composer missing RBAC permission decorator

原因分析

可能原因:api/controllers/console/agent/composer.py 中,AgentComposerApi.get 方法(约 517 行)只使用了 @setup_required@login_required@account_initialization_required@with_current_tenant_id@with_session 装饰器,遗漏了与其兄弟方法 AgentComposerApi.put(约 530 行)一致的 RBAC 权限装饰器。这导致只读接口未执行工作区级别的 RBAC 授权检查。

需要说明的是,该问题并不局限于 AgentComposerApi.get 一个接口。同文件中多个只读接口(如 AgentComposerValidateApi.postAgentComposerCandidatesApi.getWorkflowAgentComposerApi.getSnippetAgentComposerApi.get 等)均缺乏对应的 RBAC 装饰器,而其对应的写入接口则正确强制了权限检查。这可能是开发过程中只对写入接口添加权限校验,忽略了对读取接口的权限控制。

环境排查

  • 确认 Dify 版本是否为 1.17.0(main 分支)或包含相同代码逻辑的版本。
  • 确认部署方式是否为 Self Hosted(Docker),并检查部署版本是否为官方发布的稳定版本。
  • 确认工作区是否已启用 RBAC 功能,且用户角色是否为不具备 AGENT_MANAGE 权限的普通成员。
  • 检查 api/controllers/console/agent/composer.py 文件中 AgentComposerApi.get 方法(约 511-521 行)的装饰器列表,确认是否缺少 @rbac_permission_required 装饰器。
  • 检查同文件中其他只读接口(如 AgentComposerCandidatesApi.getWorkflowAgentComposerApi.get 等)是否也存在相同的权限校验缺失。

解决步骤

  1. 备份原始文件:在修改前备份 api/controllers/console/agent/composer.py 文件。
  2. 定位 AgentComposerApi.get 方法:打开 api/controllers/console/agent/composer.py,找到 AgentComposerApi.get 方法(约 517 行)。
  3. 添加 RBAC 装饰器:@with_session 装饰器下方添加缺失的 RBAC 权限装饰器:
    @rbac_permission_required(RBACResourceScope.WORKSPACE, RBACPermission.AGENT_MANAGE, resource_required=False)
  4. 检查其他接口(可优先尝试但未验证):如果希望全面修复,可检查并处理同文件中其他缺失 RBAC 装饰器的只读接口,包括 AgentComposerValidateApi.postAgentComposerCandidatesApi.getWorkflowAgentComposerApi.getSnippetAgentComposerApi.get 等。但建议先确认官方后续版本是否有更完整的修复方案。
  5. 重启服务:修改完成后重启 Dify API 服务使改动生效。

验证方法

在启用了 RBAC 的工作区中,使用不具备 AGENT_MANAGE 权限的普通成员账号重新调用 GET /console/api/agent/<agent_id>/composer 接口,确认返回 403 Forbidden 而不是完整的配置数据。同时使用具备 AGENT_MANAGE 权限的管理员账号验证接口仍可正常访问,确保权限校验未误伤正常用户。

参考来源

langgenius/dify #41324

GamsGo AI

AI 工具推荐

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

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

了解 GamsGo AI

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

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 20523

发表回复

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