authsource是认证必填参数,指定用户凭证所在数据库,而非操作数据库;不指定或错误将导致authentication failed,因mongodb不跨库查找用户,必须与createuser时的数据库完全一致。

因为MongoDB的认证数据库和操作数据库是分离的,authSource 指定的是“去哪个库查用户”,不是“你要连哪个库”。不指定或指定错,驱动就默认去 admin 库找用户——而你的用户很可能在别的库下。
authSource 不是可选项,而是认证路径的必填地址
MongoDB 的用户是绑定在某个具体数据库下的,比如你在 zy 库里执行 db.createUser(...),那这个用户就只存在于 zy 库的 system.users 集合中。服务端不会跨库自动查找用户。
- 没传
authSource:驱动默认用admin作为认证源,如果用户不在admin下,直接报Unauthorized - 传了
authSource=zy:驱动就去zy库查system.users,匹配成功才放行 - 连接字符串里写
mongodb://u:p@h:27017/zy?authSource=zy是常见且正确的写法;/zy是默认操作库,authSource=zy是认证库,二者可以相同,也可以不同
为什么有时候不写 authSource 也能连上?
这通常意味着你的用户确实建在 admin 数据库下,或者 MongoDB 实例根本没开认证(authorization: disabled)。但不能因此认为 authSource 可省略。
- MongoDB 4.2+ 新部署默认开启
authorization: enabled,此时不指定authSource就等于硬编码依赖admin库存在对应用户 - 在 MongoDB 8.0 上测试发现:若用户建在非
admin库,且未传authSource,部分旧驱动(如mongodb-driver-sync-4.2.1)会跳过认证逻辑直接失败,而非降级尝试 - 不同版本行为不一致,靠“侥幸连上”会掩盖配置缺陷,上线后容易突然中断
authSource 和 authMechanism 要配对看
authSource 解决“去哪找用户”,authMechanism 解决“怎么验密码”。两者缺一不可,尤其在混合环境里。
- SCRAM-SHA-1 和 SCRAM-SHA-256 对用户凭证存储格式要求不同,如果服务端用户是用 SHA-1 创建的,客户端却指定
authMechanism=SCRAM-SHA-256,即使authSource正确也会报错 - URI 中显式声明更可靠:
mongodb://u:p@h:27017/db?authSource=admin&authMechanism=SCRAM-SHA-256 - Spring Boot 等框架若通过
spring.data.mongodb.uri配置,漏掉authSource参数是Unauthorized报错的头号原因
最容易被忽略的一点:当你用脚本或工具创建用户时,当前所在的数据库(use xxx)决定了用户归属库;但连接时的 authSource 必须和这个“xxx”完全一致——大小写、拼写、有无空格,一个字符都不能差。











