应升级驱动并启用SSL/TLS:MongoDB 4.0+默认使用SCRAM-SHA-256,旧驱动不识别需升级(如pymongo≥3.7、mongodb@4.x、Java驱动≥4.3),且必须开启SSL加密通道,否则握手失败易被误判为认证错误。

旧版驱动连接报 Authentication failed 怎么办
不是密码错了,是驱动根本不认识 SCRAM-SHA-256。MongoDB 4.0+ 默认创建的用户只存 SHA-256 哈希,而老驱动(比如 pymongo SCRAM-SHA-1 或更老的 MONGODB-CR,连挑战步骤都解析失败。
常见现象:Authentication failed、Failed to authenticate、日志里出现 Unsupported mechanism: SCRAM-SHA-256。
- 先确认驱动版本:比如 Python 用
pymongo.version,Node.js 查mongodb package.json中的version - 若驱动确实不支持
SCRAM-SHA-256,不要硬加?authMechanism=SCRAM-SHA-256参数——它只会让驱动报更早的解析错误 - 降级鉴权不是“关掉鉴权”,而是重建一个用
SCRAM-SHA-1存哈希的用户,且 MongoDB 服务端必须允许该机制(4.0+ 默认允许,但需确认配置未禁用)
降级到 SCRAM-SHA-1 用户要重跑 db.createUser()
不能复用旧用户改机制,MongoDB 不允许对已有用户切换哈希算法。必须删掉原用户,新建一个明确指定 mechanisms: ["SCRAM-SHA-1"] 的用户。
- 连接 admin 库执行:
db.dropUser("olduser") - 再运行:
db.createUser({ user: "olduser", pwd: "xxx", roles: [{role:"readWrite", db:"mydb"}], mechanisms: ["SCRAM-SHA-1"] }) - 注意:MongoDB 4.4+ 默认仍启用
SCRAM-SHA-1,但某些 FIPS 模式或自定义配置可能已禁用,需检查mongod.conf中是否设置了scramIterationCount且未屏蔽该机制 - 验证新用户可用性:用
mongosh --username olduser --password --authenticationDatabase admin手动连一次
authSource 和 authMechanism 在连接串里不能乱配
即使降级到 SCRAM-SHA-1,连接串写错照样连不上。老驱动对参数敏感,尤其 authSource 必须指向用户实际所在的认证库(通常是 admin),而不是业务库。
- 错误写法:
mongodb://u:p@h:27017/mydb?authSource=mydb—— 用户不在mydb里,authSource错了 - 正确写法:
mongodb://u:p@h:27017/mydb?authSource=admin(假设用户建在 admin) - 显式指定机制仅在必要时才加:
?authMechanism=SCRAM-SHA-1。多数老驱动会自动协商,加了反而可能触发不兼容路径 - Spring Boot 用户注意:
spring.data.mongodb.uri中若含authMechanism,必须和实际用户机制严格一致,否则启动就报com.mongodb.MongoSecurityException
驱动升级比降级用户更稳妥
降级用户只是临时解燃眉之急,隐患不少:SHA-1 已被标记为弱哈希,部分合规场景(如等保、金融审计)明确禁用;且一旦服务端未来升级策略停用 SCRAM-SHA-1,所有老驱动瞬间全挂。
真正可持续的做法是升级驱动:
- Python:升
pymongo>=3.7(支持SCRAM-SHA-256)并确认ssl开启(因 SHA-256 要求加密通道) - Node.js:用
mongodb@4.x或更高,初始化 client 时无需额外配authMechanism,自动协商 - Java:换
mongodb-driver-sync 4.3+,旧的mongo-java-driver包名已废弃 - 关键点:升级后,连接串里的
?authMechanism=SCRAM-SHA-256可删——现代驱动默认走这个,加了反而可能干扰自动协商逻辑
最易被忽略的是 SSL/TLS:SCRAM-SHA-256 要求通信加密,若连接串没开 ssl=true 或服务端没配证书,即便驱动支持也会在握手阶段失败,错误常被误判为鉴权问题。



















