MongoDB的权限体系基于角色进行管理,通过给用户分配不同的角色,来控制用户对数据库资源的操作权限,所有权限都围绕角色展开,内置角色已经覆盖了大部分常规使用场景,同时也支持用户自定义角色来满足特殊需求。

MongoDB内置角色分类
MongoDB的内置角色按照作用范围可以分为以下几类,不同类别的角色对应不同的操作权限:
数据库用户角色
这类角色仅作用于单个数据库,是最常用的基础权限角色,包含两种:
- read:允许用户读取指定数据库的所有非系统集合数据,以及部分系统集合的只读权限,比如
system.indexes集合。 - readWrite:在read角色权限的基础上,增加了对集合的插入、更新、删除操作权限,也可以创建、删除普通集合和索引。
数据库管理角色
这类角色同样作用于单个数据库,拥有该数据库的管理权限:
- dbAdmin:允许用户执行数据库的管理操作,比如创建、删除集合,查看数据库状态,执行索引管理、统计信息等操作,但是没有读写集合数据的权限。
- dbOwner:是单个数据库的最高权限角色,包含了readWrite、dbAdmin、userAdmin三个角色的所有权限,可以对该数据库执行所有操作。
- userAdmin:允许用户在当前数据库中创建、删除、修改用户,以及分配用户角色,但是不能操作集合数据。
集群管理角色
这类角色作用于整个MongoDB集群,只有admin数据库中存在:
- clusterAdmin:集群的最高管理权限,包含了集群所有管理操作的权限,比如添加、删除分片,管理副本集,查看集群状态等。
- clusterManager:允许用户执行集群的管理操作,比如管理分片和副本集,但是不能修改用户权限。
- clusterMonitor:只读的集群监控权限,允许用户查看集群的状态和监控数据,不能执行修改操作。
- hostManager:允许用户管理服务器相关的操作,比如关闭数据库实例,查看服务器状态等。
备份恢复角色
这类角色用于数据的备份和恢复操作,仅存在于admin数据库:
- backup:允许用户执行备份操作,比如使用
mongodump工具备份数据,需要读取所有数据库的数据权限。 - restore:允许用户执行恢复操作,比如使用
mongorestore工具恢复数据,拥有写入数据的权限。
全数据库角色
这类角色作用于所有数据库,仅存在于admin数据库:
- readAnyDatabase:允许用户读取所有数据库的普通集合数据,和单个数据库的read角色权限类似,但是范围覆盖所有库。
- readWriteAnyDatabase:允许用户读写所有数据库的普通集合数据,覆盖所有库的readWrite权限。
- userAdminAnyDatabase:允许用户在所有数据库中管理用户,分配用户角色,覆盖所有库的userAdmin权限。
- dbAdminAnyDatabase:允许用户管理所有数据库,覆盖所有库的dbAdmin权限。
超级用户角色
root角色是MongoDB中权限最高的角色,仅存在于admin数据库,拥有所有操作的权限,包括集群管理、所有数据库读写、用户管理等所有功能,生产环境不建议随意分配该角色。
自定义角色权限
如果内置角色无法满足业务需求,MongoDB支持用户自定义角色,自定义角色可以指定具体的操作权限和资源范围。下面是通过mongo shell创建自定义角色的示例:
// 切换到admin数据库,自定义角色需要在admin库创建
use admin
// 创建自定义角色,角色名为custom_read_write_role,作用于test数据库
db.createRole({
role: "custom_read_write_role",
// 角色权限列表,指定可以执行的操作
privileges: [
{
// 资源范围,这里指定为test数据库的所有集合
resource: { db: "test", collection: "" },
// 允许的操作:查询、插入、更新、删除
actions: [ "find", "insert", "update", "remove" ]
}
],
// 继承的内置角色,这里不继承其他角色
roles: []
})
创建完成后,就可以给指定用户分配这个自定义角色,分配方式和内置角色一致。
权限分配示例
下面是通过mongo shell给用户分配权限的完整示例,假设我们要给test_db数据库创建一个只读用户:
// 切换到admin数据库,用户管理操作需要在admin库执行
use admin
// 创建用户,用户名是test_reader,密码是test123456
db.createUser({
user: "test_reader",
pwd: "test123456",
// 给用户分配角色,这里分配test_db数据库的read角色
roles: [
{ role: "read", db: "test_db" }
]
})
如果需要给用户分配多个角色,可以在roles数组中增加对应的角色配置即可。
权限使用注意事项
- 生产环境尽量避免使用root超级角色,遵循最小权限原则,只给用户分配必要的权限。
- 用户角色修改后,需要重新登录才能生效,已有的连接不会自动更新权限。
- 自定义角色时,资源范围要尽可能缩小,避免权限过度开放。
- 定期审计用户权限,及时删除不再使用的用户和多余的角色。
mongodb权限管理角色权限database_user修改时间:2026-07-08 09:24:32