You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 00:36:03