MongoDB的用户体系是数据库安全的第一道防线,但在实际运维中,经常遇到这样的问题:实例里到底建了多少个用户?某个用户被分配了哪些角色?某个账号的认证数据库在哪里?这些疑问都可以通过usersInfo命令来解决。usersInfo是MongoDB提供的用户信息查询命令,它不仅能查询单个用户的详细信息,还能列出整个实例的用户清单,是权限审计和账号排查的必备工具。本文将结合实际操作,系统讲解usersInfo的用法,并延伸介绍用户创建、修改、删除的完整管理流程。

usersInfo命令的基本语法与查询方式
usersInfo命令通过db.runCommand执行,也可以使用db.getUser和db.getUsers这两个封装好的shell辅助方法。它的核心参数指定了要查询哪些用户,支持多种形式。最简单的方式是传入一个用户名字符串,此时默认在当前数据库的上下文中查询;如果要查询其他认证数据库下的用户,需要传入包含user和db字段的对象。
下面通过几个示例展示不同的查询写法。查询当前数据库admin中的单个用户,可以直接传入用户名:
// 方式一:直接执行命令,查询admin库中的reportUser用户
use admin
db.runCommand({ usersInfo: { user: "reportUser", db: "admin" } })
// 方式二:使用shell辅助方法,效果等价
db.getUser("reportUser")
如果要查询所有用户,可以使用usersInfo: 1的形式,它等价于forAllDBs: false,即查询所有数据库中的用户。这在做全局账号盘点时非常有用:
use admin
// 列出整个实例中所有数据库的用户
db.runCommand({ usersInfo: 1 })
// 等价的shell方法
db.getUsers()
查询结果会返回一个usersInfo数组,每个元素包含_id(格式为user@db)、user、db、roles、mechanisms等字段。其中roles数组列出了该用户拥有的全部角色及作用范围,这是权限审计时最需要关注的部分。
进阶查询:过滤、权限与多用户查询
usersInfo支持一些可选参数来增强查询能力。showPrivileges参数设为true时,结果不仅显示角色名称,还会把每个角色对应的具体权限(privileges)展开,包括可以执行的操作类型和资源范围。排查权限过大或权限缺失的问题时,这个参数非常实用:
use admin
db.runCommand({
usersInfo: { user: "appUser", db: "reporting" },
showPrivileges: true
})
另一个实用参数是filter,它接收一个查询条件文档,类似于find的过滤语法,用于在大量用户中筛选目标。比如只想查看admin库中拥有readWriteAnyDatabase角色的用户:
use admin
db.runCommand({
usersInfo: 1,
filter: { roles: { role: "readWriteAnyDatabase", db: "admin" } }
})
还可以传入一个数组同时查询多个指定用户,数组中每个元素可以是用户名字符串,也可以是包含user和db的对象,适合批量核对账号信息:
use admin
db.runCommand({
usersInfo: [
{ user: "reportUser", db: "reports" },
{ user: "appUser", db: "reporting" }
]
})
需要注意权限限制:普通用户执行usersInfo时只能看到自己的信息,只有拥有viewUser或viewUserAnyDatabase角色的用户才能查看其他账号。这也提示我们在设计权限体系时,应专门为运维审计账号分配viewUser角色,而不是直接给root权限。
配合用户生命周期命令实现完整管理
usersInfo主要用于查询,完整的用户管理还需要配合createUser、updateUser、dropUser等命令。创建用户时使用createUser,必须指定用户名、密码和角色列表,并且要在目标认证数据库上执行。MongoDB建议尽量把用户集中在admin库中管理,便于统一维护:
use reporting
db.createUser({
user: "appUser",
pwd: passwordPrompt(), // 交互式输入密码,避免明文留在历史记录中
roles: [
{ role: "readWrite", db: "reporting" },
{ role: "read", db: "reports" }
]
})
修改用户使用updateUser,可以调整角色列表或重置密码。修改角色时要注意,updateUser的roles参数是整体替换而不是追加,如果只想增加一个角色,需要把原有角色一并写上。这也是很多初学者容易踩的坑:修改完发现原角色丢了,可以用usersInfo重新查询确认:
use reporting
// 先查原角色
db.runCommand({ usersInfo: "appUser" })
// 整体替换角色列表,原有角色必须同时保留
db.updateUser("appUser", {
roles: [
{ role: "readWrite", db: "reporting" },
{ role: "read", db: "reports" },
{ role: "read", db: "logs" }
]
})
// 重置密码
db.updateUser("appUser", { pwd: passwordPrompt() })
删除用户使用dropUser,操作前建议先用usersInfo确认目标用户信息,避免误删。如果需要删除某个数据库下的所有用户,可以使用dropAllUsersFromDatabase,但该操作不可逆,生产环境务必谨慎:
use reporting
// 删除前确认用户存在及其角色
db.getUser("appUser")
// 删除单个用户
db.dropUser("appUser")
// 删除当前数据库下的所有用户(危险操作,慎用)
db.runCommand({ dropAllUsersFromDatabase: 1 })
掌握这些命令后,建议将用户管理纳入日常运维规范:定期用usersInfo做权限审计,检查是否存在权限过大的账号;创建用户时遵循最小权限原则,只分配业务所需的角色;密码修改和账号清理要有记录可查。这些习惯能显著降低数据库被越权访问的风险。
MongoDB用户管理usersInfo数据库安全修改时间:2026-09-04 17:28:35