MongoDB 4.0+ 默认要求 SCRAM-SHA-256 认证,老用户需检查并升级旧机制(SCRAM-SHA-1 或已废弃的 MONGODB-CR),通过 db.getUser(..., {showCredentials:true}) 查看 credentials,再用 db.updateUser 指定 mechanisms:["SCRAM-SHA-256"] 强制更新,连接字符串应省略 authMechanism 以启用自动协商。

MongoDB 4.0+ 默认要求使用 SCRAM-SHA-256,但老用户(尤其是从 3.6 或更早版本升级上来的)仍可能停留在 SCRAM-SHA-1 或已废弃的 MONGODB-CR。不升级会导致连接失败、驱动报错 Authentication failed,或被 Atlas/Cloud Manager 拒绝接入。
确认当前用户的认证机制
连接到 admin 数据库后,运行以下命令查看用户凭证细节:
db.getUser("<code>username</code>", { showCredentials: true })
重点检查返回中的 credentials 字段:
- 含
"SCRAM-SHA-1"→ 需升级 - 含
"SCRAM-SHA-256"→ 已就绪 - 含
"MONGODB-CR"→ 必须升级,该机制在 4.0+ 中已被移除支持
注意:showCredentials: true 需要用户拥有 viewUser 权限,且必须在 admin 数据库执行。
用 updateUser 强制刷新为 SCRAM-SHA-256
不能只改密码;必须显式指定 mechanisms: ["SCRAM-SHA-256"],否则 MongoDB 会沿用旧机制生成新哈希。
执行命令(在 admin 库中):
db.updateUser("<code>username</code>", {
pwd: "<code>new_password</code>",
mechanisms: ["SCRAM-SHA-256"]
})
关键点:
-
pwd字段必须提供(即使想复用旧密码,也得重新输入) -
mechanisms是数组,只写["SCRAM-SHA-256"],不要混入其他机制 - 不指定
roles字段 → 角色不会丢失;但若写了roles,会完全覆盖旧角色(这是updateUser的默认行为) - 如果只想改机制不改密码,可用
passwordPrompt()替代明文密码,避免 shell 历史泄露
连接字符串里别硬编码 authMechanism
升级完用户后,客户端连接时无需强制指定 authMechanism=SCRAM-SHA-256。驱动默认按 DEFAULT 流程协商:先试 SCRAM-SHA-256,失败再降级。硬编码反而可能阻断兼容性。
正确写法(省略或设为 DEFAULT):
mongodb://<code>user</code>:<code>pass</code>@host:27017/?authSource=admin
错误写法(限制死机制,失去降级能力):
mongodb://<code>user</code>:<code>pass</code>@host:27017/?authSource=admin&authMechanism=SCRAM-SHA-256
例外:某些旧版驱动(如 pymongo
Atlas 用户特别注意:admin 数据库是唯一有效 authSource
Atlas Data Federation 要求所有 SCRAM 用户的 authSource 必须是 admin,无论用户实际权限作用于哪个数据库。即使你创建用户时指定了 db.createUser(..., { roles: [{ role: "readWrite", db: "myapp" }] }),连接时仍必须写:
mongodb+srv://<code>user</code>:<code>pass</code>@cluster.mongodb.net/?authSource=admin
写成 authSource=myapp 会直接触发 Authentication failed —— 这不是密码错,而是机制查找失败。这个细节最容易被忽略,且错误信息毫无提示性。

















