MongoDB 4.0升级后AuthenticationFailed(错误码18)主因是MONGODB-CR认证机制被移除且用户未更新为SCRAM-SHA-1,需同步升级FCV至"4.0"并重建含mechanisms:["SCRAM-SHA-1"]的用户。

升级 MongoDB 4.0 后连不上、报 Authentication failed(错误码 18),大概率不是密码错了,而是用户认证机制还卡在旧模式——MONGODB-CR 已被彻底移除,而你的用户没更新到 SCRAM-SHA-1。
为什么升级后老用户直接失效
MongoDB 4.0 完全移除了对 MONGODB-CR 的支持,且不再提供 authSchemaUpgrade 命令。如果你是从 2.6 或早期 3.x 升级上来的部署,且一直没手动刷新过用户,db.system.users 里仍存着 "mechanisms": ["MONGODB-CR"] 的记录。服务端启动后直接拒绝该机制的任何认证请求,客户端连握手都过不去。
这不是驱动问题,也不是密码哈希不兼容(bcrypt 哈希值本身完全跨版本可用),纯粹是用户元数据没适配新协议。
- 用
mongosh连上去查:use admin→db.system.users.findOne({user: "myuser"}),看返回里的mechanisms字段 - 如果值是
["MONGODB-CR"],必须重建用户;如果是空或["SCRAM-SHA-1"],再排查其他环节 -
db.getUser()不一定显示完整字段,优先查db.system.users集合
重建用户前必须确认 FCV
Feature Compatibility Version(FCV)决定服务端是否允许启用新认证流程。即使你手动建了 SCRAM 用户,若 FCV 还停在 "3.6" 或更低,MongoDB 会静默忽略新机制,继续按旧规则校验——结果还是失败。
执行以下命令确认并修正:
db.adminCommand({getParameter: 1, featureCompatibilityVersion: 1})
若返回不是 "4.0",立即升级:
db.adminCommand({setFeatureCompatibilityVersion: "4.0"})
- FCV 必须与当前 MongoDB 主版本一致,不能超前(如 4.0 服务端设成
"4.2"会报错) - 设完 FCV 后无需重启,但必须等所有副本集成员都完成该命令才生效
- 设错 FCV 可能导致写入阻塞,务必在维护窗口操作
重建用户要指定 mechanisms 和 roles source
别用 db.updateUser() 尝试“就地升级”——MONGODB-CR 用户无法通过 update 切换机制,只能删掉重来。重建时两个参数最关键:
-
mechanisms: ["SCRAM-SHA-1"]:显式声明,不能省略;4.0 不再接受空值或默认 fallback -
roles里的db字段必须和实际授权数据库一致,比如用户要在myapp库读写,role 就得写{role: "readWrite", db: "myapp"},不能只写库名字符串 - 认证数据库(即
db.createUser()所在库)必须是admin(管理员)或对应业务库;连接时的authSource必须与之一致
示例(在 admin 库创建可管 myapp 的用户):
use admin
db.createUser({
user: "appuser",
pwd: "xxx",
roles: [{role: "readWrite", db: "myapp"}],
mechanisms: ["SCRAM-SHA-1"]
})
连接字符串和驱动必须同步匹配
用户重建完,不代表万事大吉。旧驱动(如 PyMongo MONGODB-CR 请求,或根本不认识 SCRAM-SHA-1 字符串。此时连接会卡在 handshake 阶段,或报 Auth mechanism not specified。
- Java Driver:确保
mongodb-driver-sync≥ 3.12,Spring Boot 2.4+ 默认带 4.3+ - PyMongo:≥ 3.7 才稳定支持 SCRAM,
pip install pymongo>=4.0更稳妥 - 连接字符串里加
?authMechanism=SCRAM-SHA-1是冗余但保险的做法,尤其当驱动版本边界模糊时 - 不要依赖驱动自动协商——4.0 服务端不提供降级选项,不匹配就断连
真正容易被忽略的是:FCV 和用户 mechanisms 必须同时到位。只改一个,等于白干。而且这个过程不可逆——一旦设了 setFeatureCompatibilityVersion: "4.0",你就不能再降级回 3.6 兼容模式,所以操作前必须确认备份可用、应用已验证。











