连接 MongoDB 报错 AuthenticationFailed 用户密码正确为何失败

文章导读
MongoDB 连接报 AuthenticationFailed 且密码正确时,大概率是 authSource 参数与用户实际所在数据库不一致。MongoDB 用户绑定在特定数据库下,认证时必须指定正确的认证源,否则服务端无法找到用户凭证。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

MongoDB 连接报 AuthenticationFailed 且密码正确时,大概率是 authSource 参数与用户实际所在数据库不一致。MongoDB 用户绑定在特定数据库下,认证时必须指定正确的认证源,否则服务端无法找到用户凭证。

先说结论:AuthenticationFailed 错误码 18 通常不是密码错误,而是客户端未在连接字符串中正确指定 authSource 参数,导致服务端在错误数据库中查找用户。

  • 先确认:用户是在哪个数据库执行的 db.createUser,该库名即为 authSource 值。
  • 先处理:在连接 URI 或客户端配置中显式添加 authSource 参数,确保与用户创建库一致。
  • 再验证:使用 mongosh 或代码客户端携带相同参数重试连接,确认不再报错。

命令速用版

若使用命令行或代码连接,请参照以下格式修正 authSource 参数。

命令行连接:

mongosh "mongodb://user:pwd@host:port/dbname?authSource=admin"

PyMongo 连接:

client = MongoClient("mongodb://user:pwd@host:port/dbname", authSource="admin")

Java 驱动配置:

MongoCredential.createCredential("user", "admin", "pwd".toCharArray())

为什么会这样

MongoDB 用户凭证存储在创建该用户时指定的具体数据库中,而非全局系统表。客户端连接时若未指定 authSource,默认会使用连接字符串末尾的数据库名作为认证源。若用户创建在 admin 库,而连接字符串末尾是业务库名且未指定 authSource,服务端会在业务库中查找用户,导致找不到凭证而报错 AuthenticationFailed。

分步处理

步骤 1:确认用户所属数据库

登录 MongoDB 服务端,查看用户创建位置。若无法登录,回忆创建用户时 use 的是哪个库。默认管理员用户通常在 admin 库。

步骤 2:修正连接字符串

在 URI 查询参数中添加 authSource。例如用户位于 admin 库,业务库为 myapp:

mongodb://root:pwd@localhost:27017/myapp?authSource=admin

注意 authSource 是查询参数,不是路径的一部分,需用问号连接。

连接 MongoDB 报错 AuthenticationFailed 用户密码正确为何失败

步骤 3:检查认证机制兼容性

MongoDB 4.0+ 默认启用 SCRAM-SHA-256,老版本驱动可能仅支持 SCRAM-SHA-1。若 authSource 正确仍报错,尝试在连接参数中指定 authMechanism=SCRAM-SHA-1 或升级驱动。

怎么验证是否生效

命令行验证:

使用 mongosh 携带参数登录,执行 db.runCommand({connectionStatus: 1}),查看 authInfo 中是否包含当前用户。

代码验证:

运行客户端代码执行 list_collection_names 或 ping 命令,若无 OperationFailure 异常则连接成功。

日志检查:

查看 MongoDB 服务端日志,确认不再有 Authentication failed 记录,而是显示连接成功。

常见坑

特殊字符未编码:密码中包含 @、:、/ 等字符时,必须在 URI 中进行百分号编码,否则解析错误。

平台限制:部分低代码平台或数据集成工具不支持显式配置 authSource,强制使用填写的数据库名认证。此时需在目标业务库下新建用户,而非复用 admin 用户。

mongodb+srv 协议:使用 mongodb+srv 协议时,部分驱动忽略 URI 中的 authSource 查询参数,必须通过客户端构造函数的关键字参数传递。

常见问题

为什么 mongosh 能连上但代码连不上?

因为 mongosh 命令可能默认带了 `--authenticationDatabase` 参数,而代码驱动默认使用 URI 末尾数据库名作为认证源,需显式配置 authSource。

MongoDB Atlas 用户 authSource 填什么?

MongoDB Atlas 所有数据库用户都必须建在 admin 库,authSource 固定为 admin,不可填写其他业务库名。

密码正确为何还报错误码 18?

错误码 18 代表 AuthenticationFailed,除了密码错误外,最常见原因是 authSource 指定错误导致服务端找不到用户。

参考来源

  • 为什么 MongoDB 连接提示 Authentication Failed_检查用户所属数据库与凭据
  • 如何解决 PyMongo 连接时的 AuthenticationFailed 报错_检查 authSource 数据库参数
  • MongoDB 连接报 AuthenticationFailed 怎么办_检查 authSource 数据库参数
  • MongoDB 认证失败 (错误码 18)
  • 解决 PyMongo 连接 MongoDB Atlas 认证失败问题