MongoDB权限绑定认证库而非连接库,admin用户无法操作其他库因角色仅在创建库(如admin)生效;跨库需显式授权或正确配置authSource。

admin 用户无法操作其他库,不是因为密码错了、连接串写错了,而是 MongoDB 的角色权限天然绑定在「认证数据库」上,dbAdmin、readWrite 这类角色默认只对当前 authSource(也就是用户创建所在的库)生效,不自动跨库。
dbAdmin 角色只管“自己家”,不管“别人家”
dbAdmin 听起来像全能管理员,其实它连 find 都不能执行,更别说跨库操作。它的权限范围严格限定在「用户创建时所在的数据库」内:
- 在
admin库创建的用户,dbAdmin只允许对admin库执行createCollection、reIndex等结构管理操作 - 对
bcc-livenet库执行createIndexes?报not authorized on bcc-livenet to execute command - 哪怕你用
use admin切换到 admin 库再运行db.getSiblingDB("bcc-livenet").collection.find(),依然失败——权限不随use切换而转移
authSource 不是可选项,是必须项
连接字符串里漏掉 ?authSource=admin,是导致“明明密码对却连不上业务库”的头号原因:
- 错误写法:
mongodb://root:xxx@localhost:27017/bcc-livenet→ MongoDB 会在bcc-livenet库里找root用户,找不到就拒认 - 正确写法:
mongodb://root:xxx@localhost:27017/bcc-livenet?authSource=admin→ 明确告诉服务端:“去admin库查凭证” - 即使你用的是 root 用户,也得配
authSource=admin;否则认证阶段就卡死,根本进不到权限校验环节
要跨库操作,必须显式授予跨库角色
MongoDB 不支持“继承”或“全局默认权限”,每个库的访问权都得单独授权:
- 只给
root用户加readWriteAnyDatabase角色:db.grantRolesToUser("root", [{role:"readWriteAnyDatabase", db:"admin"}]) - 或者为业务库单独建用户(更安全):
use bcc-livenet; db.createUser({user:"bcc_rw", pwd:"xxx", roles:["readWrite"]}),然后连接时用?authSource=bcc-livenet - 注意:
dbAdminAnyDatabase不能代替readWriteAnyDatabase——前者管结构,后者管数据,两者不重叠
db.stats() 失败可能和权限无关
看起来只是查个统计,但 db.stats() 在 WiredTiger + journal 开启时,会触达存储引擎底层状态,部分指标被划入 read 权限范畴:
- 现象:
db.getCollectionNames()成功,db.stats()却报not authorized - 原因:前者只读元数据目录,后者需要实际读取数据文件统计信息
- 解法:补
read角色,或直接用readWrite(它已包含read) - 别急着加高危角色,先跑
db.runCommand({connectionStatus: 1})看authInfo里列的角色是不是你预期的
真正容易忽略的不是该加什么角色,而是权限生效的前提:用户必须在正确的库中创建、连接时必须指定正确的 authSource、命令执行时上下文数据库($db)必须匹配角色作用域——三者缺一不可。错一个,not authorized 就照常报,而且错误信息从不告诉你到底哪一步错了。


















