错误码18的authenticationfailed大概率是authsource参数与账号创建数据库不一致所致,如用户在admin库创建则authsource必须为admin,不可省略或错配为其他库名。

authSource 参数必须和账号创建时的数据库一致
错误码 18 的 AuthenticationFailed 大概率不是密码错了,而是 authSource 指错了。MongoDB 不像 MySQL 那样把用户存在全局系统库,每个账号都绑定在某个具体数据库下——比如你在 admin 库里用 db.createUser(...) 创建了 root,那它的认证源就只能是 admin,不能写成 test 或留空。
常见错误现象:
- mongosh 登录时加了
--authenticationDatabase admin就通,不加就报错 - 连接字符串里漏掉
authSource=admin,或写成了authSource=test - Dataphin 等平台不支持显式配置
authSource,只允许在目标库下建子账号(见后文)
连接字符串里 authSource 怎么写才对
标准格式是: mongodb://user:pass@host:port/dbname?authSource=admin。注意三点:
-
authSource是查询用户凭证的数据库,和连接末尾的dbname可以不同(比如连myapp库但用admin库里的账号) - 如果账号在
admin创建,authSource必须为admin;如果账号是在reporting库里建的,就得写authSource=reporting - Java 驱动里对应的是
MongoCredential.createCredential("u", "admin", pwd)中第二个参数,不是连接字符串里的 path
示例(正确):mongodb://root:123@localhost:27017/myapp?authSource=admin
示例(错误):mongodb://root:123@localhost:27017/myapp?authSource=myapp(除非 root 真是在 myapp 库建的)
Dataphin 这类不支持 authSource 的平台怎么办
Dataphin 当前版本(截至 2023 年)明确不解析 authSource 参数,它会强制把认证数据库当成你填写的“数据库名”。也就是说,如果你填了数据库名 test,它就会去 test 库里找用户,而不是去 admin。
解决办法只有一条路:
- 登录 mongosh,切换到目标库:
use test - 在该库下新建账号:
db.createUser({user:"dataphin_user", pwd:"xxx", roles:["readWrite"]}) - 在 Dataphin 数据源配置中,“数据库名”填
test,“用户名”填dataphin_user
别试图复用 admin 用户——它不会生效。
SCRAM-SHA-256 认证机制引发的隐性失败
MongoDB 4.0+ 默认启用 SCRAM-SHA-256,但老版本驱动(如 Java Driver SCRAM-SHA-1。这时即使 authSource 正确、密码也对,仍会静默返回 AuthenticationFailed。
验证方式:
- 用 mongosh 连上后执行
db.runCommand({connectionStatus: 1}).authInfo.authenticationRestrictions,看是否含SCRAM-SHA-256 - 升级驱动:Java 推荐用
org.mongodb:mongodb-driver-sync:4.13.0+,Python 用pymongo>=4.0 - 临时降级服务端(不推荐):启动时加
--setParameter scramSHA256IterationCount=1或改配置文件禁用 SHA-256
这个点最容易被忽略——因为日志里没有机制不匹配的提示,只有笼统的 18 错误。











