一、核心概念
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),包括:
- 可执行的操作(如
find,insert,dropCollection) - 作用的资源(如某个数据库、集合、集群)
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)