authenticationDatabase(即authSource)仅在SCRAM认证时生效,用于指定查询用户凭证的数据库,必须与db.createUser()所在库一致;对OIDC、X.509等机制无效。

authenticationDatabase 是 MongoDB 连接字符串里一个常被误用、但实际只在特定认证机制下起作用的参数。它不是全局默认认证库,也不决定用户存哪儿——它的作用非常具体:仅当使用 SCRAM(即用户名密码)认证时,告诉客户端“去哪个数据库查这个用户的凭证”。
SCRAM 认证时 authenticationDatabase 才生效
当你用 mongosh 或驱动连接时传了 authSource(或旧版 authenticationDatabase),这个值只影响 SCRAM 流程:
客户端会去指定的数据库(比如 admin)读取 system.users 集合,比对用户名和哈希密码。
- 如果用户是在
admin创建的(绝大多数生产部署都这样),必须设authSource=admin - 如果用户建在
myapp库,则连接时得写authSource=myapp,否则报错Authentication failed - 该参数对
MONGODB-OIDC、X.509、AWS-IAM等机制完全无效——它们不查本地system.users
authSource 和 authenticationDatabase 是同一个东西
官方文档已统一用 authSource 作为连接字符串参数名;authenticationDatabase 是旧驱动遗留别名,行为一致,但新代码建议只用 authSource。
- 连接字符串示例:
mongodb://user:pass@host:27017/mydb?authSource=admin - Node.js 驱动里写法:
new MongoClient(uri, { auth: { username, password, authSource: 'admin' } }) - 误写成
authenticationDatabase=otherdb而没配authSource,某些老驱动可能静默忽略,导致连上却鉴权失败
常见错误:以为它控制用户归属库或权限范围
很多人以为设了 authSource=test 就能限制用户只能访问 test 库——完全不对。权限由角色决定,跟 authSource 无关。
- 用户创建在哪,取决于
db.createUser()时所在的数据库上下文,不是authSource - 角色赋予的权限(如
readWriteonotherdb)不受authSource影响 - 典型坑:用户建在
admin,但连接时漏写authSource=admin→ 报Unable to authenticate using SCRAM-SHA-256
OIDC / X.509 / AWS-IAM 场景下直接忽略它
这些机制根本不查 MongoDB 内部的 system.users,所以 authSource 参数会被驱动忽略(部分驱动甚至报 warning)。
-
MONGODB-OIDC用户身份来自 IdP 的 JWT,授权靠oidcIdentityProviders.useAuthorizationClaim控制是查 IDP group 还是查$external用户文档 -
X.509用证书 subject DN 匹配$external用户,authSource没意义 - Atlas 上用 AWS IAM 角色连接时,连
username和password都不用填,更别说authSource
真正容易被忽略的点是:SCRAM 用户必须明确指定 authSource,且必须与用户实际所在库一致;而其他机制下硬加上它,不仅多余,还可能干扰驱动解析逻辑。


















