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 是查询参数,不是路径的一部分,需用问号连接。
步骤 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 认证失败问题