这个错误是 MongoDB 认证失败(错误码 18),核心原因是账号密码不正确 或认证机制不匹配,导致连接时身份验证失败。以下是具体解决方案:
一、核心原因分析
错误信息明确显示 Authentication failed
(认证失败),可能的原因包括:
- 用户名或密码错误(最常见);
- 账号所在的认证数据库与连接时指定的
source
不匹配; - MongoDB 启用了特定认证机制(如 SCRAM-SHA-1/256),但客户端未正确适配;
- 账号没有足够的权限或已被锁定。
二、分步解决方案
1. 验证账号密码正确性(优先排查)
通过 mongo
shell 手动登录,确认账号密码是否正确:
bash
# 1. 连接 MongoDB 服务(不携带认证信息)
mongo localhost:27017
# 2. 切换到认证数据库(这里是 admin,与连接时的 source 一致)
use admin
# 3. 执行认证(替换为你的账号密码)
db.auth("root", "你的密码")
- 若返回
1
:认证成功,说明账号密码正确,问题出在客户端配置; - 若返回
0
:认证失败,确认为账号或密码错误,需重置密码。
2. 重置密码(若账号密码错误)
如果确认密码错误,通过 mongo
shell 重置:
bash
# 1. 先关闭 MongoDB 认证(临时操作,仅用于重置密码)
# 编辑 MongoDB 配置文件(如 /etc/mongod.conf 或 mongod.cfg),注释掉 auth: true
# 重启 MongoDB 服务:systemctl restart mongod(Linux)或 net stop MongoDB && net start MongoDB(Windows)
# 2. 连接后切换到认证数据库(admin)
mongo localhost:27017
use admin
# 3. 重置密码(替换为新密码)
db.changeUserPassword("root", "新密码")
# 4. 重新开启认证(恢复配置文件中的 auth: true),重启服务
3. 检查认证数据库是否匹配
确保连接时指定的 source
(认证数据库)与账号实际所在的数据库一致:
- 若账号是在
admin
库创建的(默认管理员账号),source
必须为admin
; - 若账号在其他库(如
test
)创建,source
需改为对应库名(如source="test"
)。
示例(Java 客户端正确配置):
java
// 确保 source 与账号所在数据库一致
MongoCredential credential = MongoCredential.createCredential(
"root",
"admin", // 账号所在的认证数据库,必须正确
"新密码".toCharArray()
);
4. 适配认证机制(若 MongoDB 版本较高)
MongoDB 3.0+ 默认使用 SCRAM-SHA-1
认证机制,部分旧驱动可能不兼容。解决方案:
-
升级 MongoDB 客户端驱动到最新版本(推荐 3.10+);
-
连接时显式指定认证机制(以 Java 为例):
javaMongoCredential credential = MongoCredential.createScramSha1Credential( "root", "admin", "密码".toCharArray() // 显式使用 SCRAM-SHA-1 );
5. 检查 MongoDB 服务状态
确保服务正常运行且监听 27017 端口:
- Linux:
systemctl status mongod
或netstat -tuln | grep 27017
; - Windows:
net start | findstr MongoDB
或netstat -ano | findstr "27017"
。
三、总结
最可能的问题是账号密码错误 或认证数据库不匹配 。优先通过 mongo
shell 验证账号密码,确认正确后检查客户端连接时的 source
配置是否与账号所在数据库一致。若问题仍存在,升级驱动或显式指定认证机制即可解决。