AuthenticationFailed(错误码18)主因是authSource与用户所在数据库不一致,而非密码错误;MongoDB用户归属具体数据库,需确保连接时authSource参数精确匹配用户创建库,如admin库创建则必须指定?authSource=admin。

AuthenticationFailed(错误码 18)几乎从不因为密码输错——而是因为 MongoDB 找不到你的用户。
authSource 必须和用户实际创建的数据库完全一致
MongoDB 不是把用户存进一个全局系统表,而是每个用户都“住在”某个具体数据库里。你在哪个库执行 db.createUser(),那个库就是它的家,也就是认证源。
- 在
admin库建的管理员账号 → 连接时必须加?authSource=admin - 在
reporting库建的应用账号 →?authSource=reporting,不能写成admin或省略 - 连接字符串末尾的
/dbname(比如/myapp)只是指定默认操作库,和认证无关
常见错误现象:mongosh 能连,代码连不上
你用 mongosh --authenticationDatabase admin -u root -p 可以登录,但 Node.js / Python / Java 里一模一样的账号密码却报错 —— 很大概率是驱动没传 authSource,或者连错了参数位置。
- Node.js(MongoDB Driver / Mongoose):
mongodb://root:pwd@localhost:27017/myapp?authSource=admin,authSource是查询参数,不是路径的一部分 - Java:
MongoCredential.createCredential("root", "admin", pwd)第二个参数是认证数据库名,不是连接串里的/myapp - PHP:
new Manager("mongodb://root:pwd@localhost:27017/?authSource=admin"),注意问号前不能有数据库名路径
Dataphin、部分低代码平台不支持 authSource 怎么办
这类平台会忽略 authSource,强制用你填的“数据库名”去查用户。它不会去 admin 找,只会去你写的那个库找。
- 别复用
admin用户,一定失败 - 登录
mongosh,先use your_target_db - 再执行
db.createUser({user:"dp_user", pwd:"xxx", roles:["readWrite"]}) - 平台配置里,“数据库名”和“用户名”就填这个新账号对应的库和名字
SCRAM-SHA-256 驱动兼容性容易被忽略
MongoDB 4.0+ 默认启用 SCRAM-SHA-256,但老版本驱动(比如 Java Driver 3.x)只支持 SCRAM-SHA-1。这时即使 authSource 正确、密码也对,也会静默返回 AuthenticationFailed。
- 验证方式:
db.runCommand({connectionStatus: 1}).authInfo.authenticationMechanisms,看返回是否含SCRAM-SHA-256 - 临时降级服务端机制(不推荐):在
mongod.conf加security.authorization: enabled和sasl.mechanisms: SCRAM-SHA-1 - 更稳妥的做法:升级客户端驱动到支持
SCRAM-SHA-256的版本(如 Java Driver 4.0+)
最常被跳过的动作是:没确认用户到底在哪建的。连之前,先用 mongosh 切到疑似建号的库,跑一遍 db.getUsers() —— 看不见用户,就别试连了。

















