MongoDB权限模型

一、核心概念

1. 用户(User)

  • 用户总是属于某一个数据库(即“认证数据库”,authenticationDatabase
  • 用户信息(用户名、密码、角色)存储在该数据库的 system.users 集合中
  • 登录时必须指定这个数据库用于身份验证

✅ 示例:

use admin
db.createUser({ user: "alice", pwd: "xxx", roles: [...] })

→ alice 是 admin 数据库的用户,登录命令为:

mongosh -u alice -p xxx --authenticationDatabase admin

2. 角色(Role)

角色定义了一组权限(Privileges),包括:

  • 可执行的操作(如 findinsertdropCollection
  • 作用的资源(如某个数据库、集合、集群)

MongoDB 提供两类 角色:

内建角色(Built-in Roles)
类别 常见角色 说明
数据库级 read, readWrite 对单个数据库的读/写
dbAdmin, userAdmin 管理集合、索引、用户等
集群级 clusterAdmin, hostManager 管理副本集、分片、监控等
超级用户 root 拥有所有权限(等同于 MySQL 的 root)

🔹 自定义角色(Custom Roles)

可精细控制权限,例如:

db.createRole({
role: "appWriter",
privileges: [
{ resource: { db: "myapp", collection: "orders" }, actions: ["insert", "update"] }
],
roles: []
})

3. 权限(Privilege) = 资源 + 操作

资源(Resource):可以是
整个集群(cluster)
某个数据库(db: "myapp")
某个集合(db: "myapp", collection: "users")
操作(Actions):如 find, insert, createIndex, dropDatabase 等

二、权限作用范围(关键!)

场景 1:用户在 admin 库创建 → 可授权任意库

use admin
db.createUser({
user: "globalUser",
pwd: "123",
roles: [
{ role: "readWrite", db: "sales" },
{ role: "read", db: "marketing" }
]
})

  • 认证数据库:admin
  • 可操作:sales(读写)、marketing(只读)

场景 2:用户在目标库创建 → 默认只能操作该库

use myapp
db.createUser({
user: "appUser",
pwd: "123",
roles: ["readWrite"] // 等价于 { role: "readWrite", db: "myapp" }
})

  • 认证数据库:myapp
  • 只能操作 myapp 库

场景 3:使用 root 角色 → 全局超级权限

use admin
db.createUser({ user: "superadmin", pwd: "123", roles: ["root"] })

  • 可操作所有数据库 + 集群管理
  • 仅限运维使用,禁止应用连接!

三、Spring Boot 中的对应配置

MongoDB 概念 Spring Boot 配置项
主机/端口 spring.data.mongodb.host / .port
目标数据库 spring.data.mongodb.database
用户名/密码 spring.data.mongodb.username / .password
认证数据库 spring.data.mongodb.authentication-database
重要规则:
如果未显式设置 authentication-database,
Spring Boot 默认使用 database 的值作为认证库
所以:
若用户建在 admin,必须显式配置 authentication-database: admin
若用户建在目标库(如 myapp),可省略该配置
✅ 示例 1:用户在 admin 库
spring:
data:
mongodb:
database: myapp
username: appuser
password: 123
authentication-database: admin # ← 必须指定!

✅ 示例 2:用户在 myapp 库

spring:
data:
mongodb:
database: myapp
username: appuser
password: 123
# authentication-database 可省略(默认 = myapp)

上一篇 U盘安装CentOS7提示“Warning :dracut-initqueue timeout - starting timeout scripts” 解决办法
下一篇 S9706 V2R6C00版本ACL资源不足的解决方案