usersInfo 命令仅返回用户在当前库显式授予的角色名,不展开具体权限、限制条件或跨库角色;查真实权限须用 rolesInfo + showPrivileges: true,并注意角色定义所在库。

直接查 usersInfo 命令返回的 roles 数组,不等于看到“全部权限”——它只列角色名,不展开具体能做什么、在哪做、受什么限制。
为什么 db.runCommand({ usersInfo: 1 }) 看不到实际权限
这个命令只返回用户在当前数据库中显式授予的角色,比如 { role: "readWrite", db: "myapp" }。但它不会告诉你:readWrite 具体包含哪些操作(find、insert、dropCollection 等),也不会显示该角色是否被 authenticationRestrictions 限定了 IP 段,更不会带出跨库角色(如 userAdminAnyDatabase)——那些必须去 admin 库查。
常见错误现象:
- 在
test库执行usersInfo,却看不到用户拥有的root权限 - 查到有
dbOwner角色,但执行db.dropDatabase()报"not authorized on admin" - 权限明明开了,但从远程连接时仍被拒绝,没意识到
authenticationRestrictions在起作用
查真实权限必须用 rolesInfo + showPrivileges: true
getRole 是不存在的命令,别试;正确方式是逐个调用 rolesInfo 并强制开启 showPrivileges: true,否则 privileges 字段为空。
实操建议:
- 先用
db.runCommand({ usersInfo: 1 })拿到当前库的角色列表 - 对每个角色,执行
db.runCommand({ rolesInfo: { role: "xxx", db: "yyy" }, showPrivileges: true })—— 注意db必须填该角色定义所在的库,内置角色(如readWrite)都在admin库 - 若用户有
userAdminAnyDatabase或clusterAdmin,必须切到admin库再查:use admin,然后db.runCommand({ usersInfo: { user: "u", db: "admin" } })
权限不是静态叠加,得靠实际操作验证
MongoDB 权限生效受多重因素影响:认证机制(SCRAM-SHA-256 还是 x.509)、连接来源(localhost exception 是否启用)、网络策略(bindIp)、甚至 serverStatus().auth 返回的 authSchemaVersion 是否匹配当前版本。
最可靠的方式是:用该用户连接后,直接运行关键操作,看报错信息。例如:
- 想确认能否删库:
db.runCommand({ dropDatabase: 1 }),失败时errmsg会明确写 “not authorized onadminto execute commanddropDatabase” - 想确认能否读某集合:
db.logs.find().limit(1),报错可能指向find权限缺失,或resource限定只允许访问db: "myapp", collection: "events"
真正麻烦的点不在命令怎么敲,而在于权限是动态组合的:一个角色继承另一个角色、authenticationRestrictions 隐式生效、集群级角色在非 admin 库不可见——这些都不会自动出现在 usersInfo 的输出里,必须手动交叉比对。











