mongoTemplate执行executeCommand报not authorized未授权错误如何解决
问题根因
- 报错
error 13 (Unauthorized)的核心原因是当前使用的MongoDB账号没有$eval命令的执行权限:$eval属于高风险命令,可直接在MongoDB服务端执行自定义JS脚本,绝大多数生产环境的MongoDB集群都会默认关闭该命令的权限分配,MongoDB 4.2及以上版本更是直接废弃了$eval命令,完全无法调用。 - 你当前的实现方式依赖已淘汰的
$eval能力,本身不符合MongoDB的最佳实践,优先建议改用原生API实现需求,不要走服务端JS脚本执行的方案。
解决方案1(仅临时测试使用,不推荐)
如果必须保留$eval的实现方式,需要给当前MongoDB账号授予对应权限,在MongoDB的admin库执行如下命令即可:
use admin // 替换为你的MongoDB账号用户名 db.grantRolesToUser("你的MongoDB用户名", [ { resource: { anyResource: true }, actions: [ "eval" ] } ])
注意:该方案会大幅放大账号权限,存在JS注入、数据误改等极高安全风险,禁止在生产环境使用。
解决方案2(生产环境推荐,无权限问题)
直接使用Spring Data MongoDB的原生Java API实现你的业务逻辑,完全不需要调用$eval执行JS脚本,性能、安全性都远高于原有实现:
// 构造查询条件 Query query = new Query(Criteria.where("_id").is("61517de29946587296c7c375")); // 查询目标文档 Map item = mongoTemplate.findOne(query, Map.class, "knowledge_resource_copy1"); if (item != null && item.get("description") != null) { String originDesc = item.get("description").toString(); // 处理description字段 String newDesc = originDesc.substring(0, 5) + "h3"; // 执行更新 Update update = new Update().set("description", newDesc); mongoTemplate.updateFirst(query, update, "knowledge_resource_copy1"); }
如果需要批量处理多条数据,可直接用游标遍历查询结果批量更新,不会触发特殊权限校验问题。
内容的提问来源于stack exchange,提问作者zhu mo
相关产品推荐
相关产品推荐

