MongoDB 5.0升级后auth失败主因是SCRAM-SHA-256机制不兼容:旧驱动(如Java Driver<4.7、Node.js<4.13)不支持,默认认证失败;需同步升级驱动、显式配置authMechanism参数,并执行db.updateUser更新用户mechanisms字段。

升级 MongoDB 5.0 后 auth 失败,大概率是驱动不支持 SCRAM-SHA-256
MongoDB 5.0 默认启用 SCRAM-SHA-256 认证机制,而 4.x 及更早版本默认用 SCRAM-SHA-1。如果你没改过用户凭据的认证机制,升级后旧驱动(比如 Java Driver 3.x、Node.js mongodb 4.1 以下)会因无法协商新算法直接报 Authentication failed(错误码 18),且日志里通常不提示具体机制不匹配。
验证方式很简单:用 mongosh 连上去查用户认证机制:
use admin
db.getUser("root")
看返回中 mechanisms 字段——如果只有 ["SCRAM-SHA-256"],而你的驱动不支持它,就必然失败。
Java Driver 必须升到 4.7+ 才能默认支持 SCRAM-SHA-256
Java 客户端不是“升级驱动就能自动适配”,得确认版本和显式配置都到位:
-
MongoClient构造时若用MongoCredential.createCredential(),无需额外指定机制,但驱动版本必须 ≥ 4.7;4.6 及以下即使连得上,也会在认证阶段静默 fallback 到 SHA-1(如果服务端允许),而 5.0 默认禁用 SHA-1 - 若你用的是 Spring Boot +
spring-boot-starter-data-mongodb,检查实际引入的mongodb-driver-sync版本:Spring Boot 2.7 默认带 4.6,不够;需手动覆盖为 4.7+ - 连接字符串里加
?authMechanism=SCRAM-SHA-256没用——老驱动压根不认识这个参数,会忽略或报错
Node.js 的 mongodb 驱动要 >= 4.13.0
4.12.x 虽然声称支持 SHA-256,但存在 handshake 协商 bug,尤其在 TLS + 认证混用时容易卡在 connecting 状态;4.13.0 是第一个稳定支持的版本:
- 检查当前版本:
npm list mongodb - 升级命令:
npm install mongodb@^4.13.0 - 连接字符串必须显式声明机制,否则默认仍走 SHA-1:
mongodb://user:pass@localhost:27017/admin?authMechanism=SCRAM-SHA-256 - 如果服务端强制禁用 SHA-1(
setParameter: {disableJavaScriptProtection: true}配合安全策略),不加authMechanism参数会直接拒绝连接
别跳过 db.updateUser() 这一步
即使你升级了驱动,如果用户是 4.x 时代创建的,它的 mechanisms 字段可能仍是 ["SCRAM-SHA-1"]。MongoDB 5.0 不会自动帮你升级用户机制,得手动刷新:
use admin
db.updateUser("root", { mechanisms: ["SCRAM-SHA-256"] })
注意点:
- 执行前确保已用管理员账号成功登录(比如先用
mongosh --username root --password --authenticationDatabase admin) - 该操作不会改密码,只更新认证机制列表;如果想同时支持两种机制(过渡期),写成
["SCRAM-SHA-1", "SCRAM-SHA-256"] - 如果服务端配置了
security.authorization: enabled但没设setParameter.disableJavaScriptProtection: true,这步可能被安全策略拦截,需临时关闭或提权执行
机制不匹配的问题藏得深,驱动版本、用户元数据、连接参数三者必须对齐,漏掉任一环都会在看似正常的地方突然断连。



















