db.getUsers()仅返回当前数据库的用户,不显示其他库用户;需逐库执行或脚本遍历各库调用该命令才能获取实例全部用户。

db.getUsers() 只返回当前数据库的用户,不是“所有用户”
很多人以为在 admin 库执行 db.getUsers() 就能看到全部用户权限,其实它只查当前库(即 admin)里创建的用户。MongoDB 的用户是按数据库隔离存储的:你在 myapp 库用 db.createUser() 创建的用户,admin 库里根本看不到。
所以如果你没在 admin 库创建过用户,db.getUsers() 可能返回空数组,哪怕其他库有几十个用户。
- 必须先
use admin,再运行db.getUsers(),否则查的是默认库(通常是test) -
db.getUsers({showCredentials: true})可以显示密码哈希(仅限 4.0+,且需有viewUser权限) - 想查某用户详细字段(比如
authenticationRestrictions),得用db.getUser("username"),不是getUsers
真正想看“所有用户”,得组合查多个库
MongoDB 没有单命令列出全实例所有用户的接口。所谓“所有用户”,其实是分散在各个数据库的 system.users 集合里,而 admin 是唯一能跨库授角色的库——但不存其他库的用户文档。
实操建议:
- 先
use admin,跑db.getUsers()看管理员类用户(如root、userAdminAnyDatabase) - 再逐个切库:比如
use myapp→db.getUsers(),查该业务库的本地用户 - 用
db.adminCommand({listDatabases: 1})获取库名列表,写脚本循环更省事(注意权限是否允许 listDatabases) - 别依赖
db.system.users.find()—— 它在 4.0+ 默认不可见,且只返回当前库的原始文档,不含角色展开信息
权限细节藏在 roles 字段里,得手动展开
db.getUsers() 返回的每个用户对象里,roles 是个数组,只写角色名和所属库,比如 {role: "readWrite", db: "logs"}。它不告诉你这个角色具体能干啥——readWrite 包含哪些操作?有没有被限制 IP?这些得额外查。
关键步骤:
- 对每个角色,运行
db.runCommand({rolesInfo: {role: "readWrite", db: "logs"}})查内置角色的权限动作列表 - 检查用户对象里的
authenticationRestrictions字段,它可能限制登录 IP 或客户端证书 - 如果用户有
dbOwner角色,注意它等价于readWrite + dbAdmin + userAdmin,不是“完全无限制”
容易漏掉的认证配置项:--authenticationDatabase
即使你查到了用户和角色,登录时仍可能失败——因为 MongoDB 允许指定认证库。比如用户是在 admin 库创建的,但启动时加了 --authenticationDatabase myapp,那登录就得用 myapp 库的凭证,而不是 admin 的。
确认方式:
- 查配置文件或启动参数,找
security.authorization: enabled和authenticationDatabase设置 - 连接后运行
db.runCommand({getCmdLineOpts: 1}),看parsed.security.authenticationDatabase字段 - 如果没显式设,缺省就是
admin;但如果设了,db.getUser()就必须在那个库下执行才有效
权限本身不难查,难的是搞清“在哪查”和“查到的是谁的权限”。一个用户在 admin 库有 root 角色,在 reporting 库只有 read 角色,这两份权限不会自动合并显示——得分别进两个库查,再人工拼起来。


















