db.getUsers() 返回当前数据库的本地用户列表,需先 use 切换到目标库(如 admin 或业务库),不显示其他库用户或集群级用户;空结果常因库切换错误、权限不足或 authenticationRestrictions 限制。

用 db.getUsers() 查看当前数据库的用户列表
在 MongoDB shell(或 mongosh)中,db.getUsers() 是最直接、最常用的方式,它返回当前数据库(即你 use 切换到的那个库)下所有本地用户的信息。注意:它不显示其他数据库的用户,也不显示内置角色(如 __system)或集群级用户(比如 admin 库里的用户)。
常见错误现象:db.getUsers() 返回空数组 [],不是因为没用户,而是你当前连的是 test 或其他非认证库,而用户实际建在 admin 库里。
- 务必先
use admin,再执行db.getUsers()—— 管理员用户通常建在admin库 - 如果只关心某个数据库的权限用户(比如只给
myapp库授权的用户),就use myapp后运行 - 加参数可过滤:
db.getUsers({ filter: { "user": "alice" } }),避免返回大量无关用户
show users 命令为什么有时不显示任何内容
show users 是 shell 的便捷命令,本质等价于 db.getUsers(),但它依赖当前上下文和权限。它不报错、不提示、也不解释“为什么空”,容易让人误以为没用户。
使用场景:适合快速核对当前库的用户,但不能替代精确查询。
- 必须有
viewUser或更高权限(比如userAdmin角色)才能看到用户信息;普通读写用户执行会静默失败 - 在未启用访问控制(
--auth)的实例上,show users总是返回空,哪怕其实有用户——因为权限系统根本没激活 - mongosh 中该命令仍可用,但老版本 mongo shell(已弃用)可能输出格式混乱,建议统一用
db.getUsers()
跨数据库查用户必须切换 use,不能靠 db.adminCommand
有人尝试用 db.adminCommand({ listUsers: 1 }) 想一次性拉出所有库的用户,这是错的。listUsers 是数据库级命令,必须在目标库上下文中执行,否则报错 "not authorized on admin to execute command" 或返回空。
性能与兼容性影响:频繁切换 use 不影响性能,但脚本化时容易漏掉库。MongoDB 不提供“全局用户视图”接口。
- 要查全部,得依次
use admin→db.getUsers(),再use myapp→db.getUsers()…… -
db.adminCommand({ listDatabases: 1 })可帮你先拿到库名列表,再循环处理 - 4.0+ 版本支持
db.runCommandOnAllShards,但仅限分片集群且仍需按库调用listUsers
用户存在但 db.getUsers() 看不见?检查 roles 和 authenticationRestrictions
有时候用户确实存在,也能正常登录,但 db.getUsers() 就是不返回——大概率是因为该用户被设定了 authenticationRestrictions(比如 IP 白名单),而当前连接来源不在允许范围内,导致鉴权阶段就被拦截,shell 根本拿不到用户元数据。
另一个隐蔽原因是:用户被赋予了 clusterAdmin 这类集群级角色,但没显式绑定到任何数据库,db.getUsers() 默认只返回「数据库级用户」,这类用户会消失在结果里。
- 确认连接是否满足
authenticationRestrictions:检查net.bindIp和客户端 IP 是否匹配 - 用
db.runCommand({ connectionStatus: 1 })看当前连接使用的认证数据库和用户 - 真正想审计全量用户,得分别进每个业务库 +
admin库执行db.getUsers(),缺一不可
事情说清了就结束











