必须重建用户并显式指定mechanisms:["scram-sha-256"],因mongodb不自动升级旧用户哈希;驱动连接串需严格匹配authmechanism=scram-sha-256和authsource=admin。

确认当前认证机制和用户是否兼容 SCRAM-SHA-256
直接运行 db.runCommand({connectionStatus: 1}),检查返回中的 authMechanisms 字段。如果只列出 SCRAM-SHA-1,说明当前用户是用旧机制创建的,不能直接切到 SCRAM-SHA-256 —— MongoDB 不允许对同一用户名混用两种机制。
再查用户详情:db.getUser("your_username"),重点看 mechanisms 数组。若为空或只有 "SCRAM-SHA-1",就必须重建用户;若已含 "SCRAM-SHA-256",说明该用户已支持新机制,可跳过重建步骤。
注意:MongoDB 4.0+ 默认接受 SCRAM-SHA-256 连接,但**不会自动升级旧用户密码哈希**。服务端仍按原机制验证,强行在连接串里指定 authMechanism=SCRAM-SHA-256 会报错 Authentication failed。
重建用户时必须显式指定 mechanisms 参数
用 db.createUser() 创建新用户时,mechanisms 字段不能省略。默认行为是只创建 SCRAM-SHA-1 用户(即使 MongoDB 版本是 5.0),除非你明确声明:
-
mechanisms: ["SCRAM-SHA-256"]→ 只支持新机制 -
mechanisms: ["SCRAM-SHA-1", "SCRAM-SHA-256"]→ 双机制共存(仅限 4.0+,且需确保驱动支持)
示例命令:
db.createUser({
user: "appuser",
pwd: "strongpass123",
roles: [{role: "readWrite", db: "mydb"}],
mechanisms: ["SCRAM-SHA-256"]
})
遗漏 mechanisms 或写成 ["scram-sha-256"](小写)都会失败,报错 Invalid SCRAM mechanism。大小写必须严格匹配文档定义。
驱动连接字符串必须同步更新 authMechanism 和 authSource
Java、Python、Node.js 等驱动若仍用旧连接串,即使服务端用户已重建,也会因协商失败而拒绝连接。关键参数缺一不可:
-
authMechanism=SCRAM-SHA-256(必须大写、连字符、无空格) -
authSource=admin(或你创建用户时指定的认证库,不能省略) -
username和password必须 URL 编码(例如@→%40,/→%2F)
错误写法:mongodb://user:pass@localhost:27017/mydb?authMechanism=scram-sha-256 → 小写机制名 + 缺 authSource,100% 认证失败。
正确写法:mongodb://user:pass@localhost:27017/mydb?authSource=admin&authMechanism=SCRAM-SHA-256
滚动升级时旧驱动可能不兼容 SCRAM-SHA-256
不是所有老版本驱动都支持 SCRAM-SHA-256。比如 Python PyMongo mongodb driver SCRAM-SHA-1。即便连接串写了 SCRAM-SHA-256,驱动也会静默降级,或直接抛出 Unsupported authentication mechanism 异常。
验证方法:启用驱动日志(如 Java 的 logging.level.org.mongodb.driver=DEBUG),搜索 auth response 或 mechanism 关键字,确认实际协商的是哪个机制。
真正平滑的关键点在于:先升级驱动,再重建用户,最后调整连接串。反过来操作,必然导致部分应用失联。
最容易被忽略的是 authSource —— 它和用户所在的数据库无关,只决定从哪个库读取用户凭证。很多人以为建在 mydb 就该设 authSource=mydb,结果连不上,因为实际用户是建在 admin 库里的。











