AuthenticationFailed 最常见的原因是认证数据库不匹配。比如用户是在 admin 库中创建的,连接 MongoDB 时就必须显式指定 authSource=admin;否则系统会默认到目标数据库里查找用户,进而触发认证失败。除此之外,SCRAM-SHA-256 与部分旧版客户端存在兼容性问题,这种情况下通常需要在服务端禁用 SHA-256,并重新创建基于 SHA-1 的用户。

连接时提示AuthenticationFailed,先确认认证数据库是否一致
很多报错信息并不会直接说明原因,但大约 90% 的 MongoDB AuthenticationFailed 问题,都是 authenticationDatabase 参数填写错误导致的。MongoDB 与 MySQL 不同,它不会默认使用当前连接的数据库来完成认证,而是必须明确指定“用户究竟是在哪个库里创建的”。
- 如果用户是在
admin库中通过db.createUser(...)创建的,那么连接时必须添加--authenticationDatabase admin(命令行方式),或者在 URI 中写入&authSource=admin(如 PyMongo 连接) - 如果用户创建在业务库,例如
myapp,那么authSource就必须填写myapp,不能误写成admin - 在 PyMongo 连接字符串中遗漏
&authSource=xxx是非常常见的错误;如果 URI 中没有该参数,系统默认会使用连接时指定的数据库名,而这个数据库往往并没有对应用户
SCRAM-SHA-256 导致旧客户端无法连接,通常需要重建用户
MongoDB 6.0 及以上版本默认只生成 SCRAM-SHA-256 凭据,但 Na vicat ≤16.0.17、Robo 3T 以及部分老旧驱动并不支持这一认证机制——它们发送的仍是 SHA-1 挑战,服务端会直接拒绝,因此最终报出的依然只是笼统的 AuthenticationFailed。
- 不能单纯依靠客户端切换认证机制来绕过:服务端不会自动协商,而是严格按照自身保存的哈希格式进行校验
- 必须修改配置并重启 MongoDB:将
disableScramSHA256: true添加到/etc/mongod.conf的setParameter配置块中 - 已有旧用户通常需要删除后重新创建:
db.dropUser("xxx")→db.createUser({ ..., mechanisms: ["SCRAM-SHA-1"] }) - 可通过结果确认是否生效:执行
db.getUser("xxx")后,返回内容中应包含"mechanisms" : ["SCRAM-SHA-1"]
Atlas 连接报 bad auth,别只检查密码,先核对白名单和用户作用域
MongoDB Atlas 中的 bad auth 错误,常常让人反复确认用户名和密码,但实际更高概率的问题,往往出在两个容易被忽略的设置上。
- IP 白名单并不是“添加过就一定有效”:必须填写当前设备的实时公网 IP。对于动态 IP 环境,需要及时更新,或者临时添加
0.0.0.0/0进行排查测试 - 数据库用户权限必须绑定到具体数据库:在 Atlas 控制台创建用户时,“Database User Privileges” 中选择的是
admin还是your-db-name,会直接决定连接时应填写的authSource - 连接字符串中的数据库名(即
@cluster.net/xxx?...里的xxx)只是默认使用的数据库,并不决定认证位置;真正参与认证判断的是authSource - 如果密码中包含特殊字符,例如
@、/、:,必须先进行 URL 编码,否则 URI 解析会失败,效果上等同于传入了错误或空密码
本地部署 MongoDB 认证失败,还要检查 authSchema 版本和启动参数
在本地部署的 MongoDB 环境中,尤其是 3.x 或 4.x 版本,出现 AuthenticationFailed 往往不仅仅是账号密码问题,还可能与 authSchema 兼容性或启动参数未正确开启 --auth 有关。
- 如果已经启用
authorization: enabled,但没有提前在admin库中创建管理员用户,那么服务虽然能正常启动,但所有连接请求都会被拒绝 - MongoDB 升级之后,旧用户凭据可能仍停留在较低版本的 schema 中(例如
currentVersion: 3),此时需要手动更新:db.system.version.update({"_id":"authSchema"},{$set:{"currentVersion":5}}) - 在 Windows 环境下,如果通过服务方式启动 MongoDB,
--auth必须写入服务注册参数,仅修改配置文件通常不会立即生效 - 可以在日志中搜索
not authorized on admin,这样能更快判断问题到底是权限不足,还是认证数据库配置错误
authSource 应该填什么、用户实际创建在哪个库、认证哈希机制是否兼容,以及 IP 白名单是否已经真正生效。只有把这些关键排查点逐一核实,才能真正解决 AuthenticationFailed 认证失败问题。