Ruoyi-AI 开源项目系统模型配置接口权限控制问题分析
问题概述
在开源全栈AI开发平台Ruoyi-AI项目中,系统模型配置管理模块存在接口权限控制不完善的情况。部分API接口未进行充分的访问验证,可能导致系统配置信息被不当访问或修改。
技术背景
Ruoyi-AI是基于若依框架开发的AI应用开发平台,提供了大模型集成、对话管理等功能模块。系统采用前后端分离架构,后端API接口本应进行严格的权限控制,但实际开发中存在部分接口访问验证不完善的情况。
问题详情
问题位置
问题存在于系统模型管理模块的SysModelController控制器中,该控制器负责处理与大模型配置相关的所有请求。以下是存在问题的关键接口:
- 查询模型列表接口:GET /system/model/list
- 导出模型数据接口:POST /system/model/export
- 新增模型配置接口:POST /system/model
- 修改模型配置接口:PUT /system/model
问题成因
分析源码可以发现,除删除接口外,其他关键操作接口均未添加权限校验注解。以修改接口为例:
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SysModelBo bo) {
return toAjax(sysModelService.updateByBo(bo));
}
对比之下,删除接口正确使用了权限校验注解:
@SaCheckPermission("system:model:remove")
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty @PathVariable Long[] ids) {
return toAjax(sysModelService.deleteWithValidByIds(List.of(ids), true));
}
这种不一致的访问控制导致了权限控制不完善的情况。
潜在影响
该问题可能造成以下风险:
- 信息不当访问:可能获取大模型API密钥等配置信息
- 配置修改:可能修改模型参数影响系统运行
- 业务逻辑干扰:通过添加不当模型配置影响系统功能
- 数据完整性:可能导出或修改关键配置数据
验证方法
通过构造HTTP请求可验证问题存在:
PUT /system/model HTTP/1.1
Host: target.com
Content-Type: application/json
{
"id": "1781709495515783171",
"modelName": "test-model",
"apiKey": "test-key",
"apiHost": "https://example.com/"
}
服务器返回200状态码即表示修改成功,证明存在访问控制不完善的情况。
改进方案
临时解决方案
- 在Web服务器层面对重要接口添加访问限制
- 使用API网关添加统一的访问验证
根本解决方案
在代码层面为所有重要接口添加权限校验注解:
// 查询接口
@SaCheckPermission("system:model:query")
@GetMapping("/list")
public TableDataInfo<SysModelVo> list(SysModelBo bo, PageQuery pageQuery) {
return sysModelService.queryPageList(bo, pageQuery);
}
// 修改接口
@SaCheckPermission("system:model:edit")
@PutMapping()
public R<Void> edit(@Validated @RequestBody SysModelBo bo) {
return toAjax(sysModelService.updateByBo(bo));
}
安全建议
- 遵循最小权限原则,为所有重要接口添加适当的访问控制
- 建立API安全开发规范,避免类似问题重复出现
- 定期进行代码审查,特别是权限相关代码
- 实施自动化测试,在CI/CD流程中加入接口权限测试
总结
Ruoyi-AI项目中的这个权限控制问题展示了API安全的重要性。开发者在实现业务功能的同时,必须时刻关注接口的安全防护。通过本次问题分析,我们不仅了解了具体的技术细节,更重要的是认识到权限控制在系统开发中的关键作用。建议所有基于若依框架开发的项目都引以为戒,做好接口权限的全面管控。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考