MongoDB 用户管理
MongoDB 提供基于角色的访问控制(RBAC),允许管理员创建用户并分配不同的权限角色,确保数据库安全。
启用认证
修改配置文件
yaml
# mongod.conf
security:
authorization: enabled重启 MongoDB 服务
bash
# Linux/macOS
sudo systemctl restart mongod
# Windows
net stop MongoDB
net start MongoDB创建管理员用户
连接到 admin 数据库
bash
mongosh
use admin创建超级管理员
javascript
db.createUser({
user: "admin",
pwd: "strongPassword123",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" },
{ role: "readWriteAnyDatabase", db: "admin" },
{ role: "dbAdminAnyDatabase", db: "admin" },
{ role: "clusterAdmin", db: "admin" }
]
})使用管理员登录
bash
mongosh -u admin -p --authenticationDatabase admin内置角色
数据库用户角色
| 角色 | 权限 |
|---|---|
| read | 读取所有非系统集合 |
| readWrite | 读写所有非系统集合 |
数据库管理角色
| 角色 | 权限 |
|---|---|
| dbAdmin | 执行管理任务(索引、统计等) |
| dbOwner | 数据库所有者权限(readWrite + dbAdmin + userAdmin) |
| userAdmin | 管理用户和角色 |
集群管理角色
| 角色 | 权限 |
|---|---|
| clusterAdmin | 集群管理权限 |
| clusterManager | 集群监控和管理 |
| clusterMonitor | 只读集群监控 |
| hostManager | 服务器管理 |
备份恢复角色
| 角色 | 权限 |
|---|---|
| backup | 备份数据 |
| restore | 恢复数据 |
所有数据库角色
| 角色 | 权限 |
|---|---|
| readAnyDatabase | 读取所有数据库 |
| readWriteAnyDatabase | 读写所有数据库 |
| userAdminAnyDatabase | 管理所有数据库用户 |
| dbAdminAnyDatabase | 管理所有数据库 |
创建普通用户
只读用户
javascript
use mydb
db.createUser({
user: "readonly",
pwd: "password123",
roles: [
{ role: "read", db: "mydb" }
]
})读写用户
javascript
db.createUser({
user: "appuser",
pwd: "appPassword456",
roles: [
{ role: "readWrite", db: "mydb" }
]
})多数据库权限用户
javascript
db.createUser({
user: "multiuser",
pwd: "multiPassword789",
roles: [
{ role: "readWrite", db: "mydb" },
{ role: "read", db: "reporting" },
{ role: "dbAdmin", db: "mydb" }
]
})用户管理操作
查看所有用户
javascript
use admin
db.system.users.find().pretty()
// 或
show users查看当前数据库用户
javascript
use mydb
db.getUsers()修改用户密码
javascript
db.changeUserPassword("appuser", "newPassword")添加角色
javascript
db.grantRolesToUser("appuser", [
{ role: "dbAdmin", db: "mydb" }
])撤销角色
javascript
db.revokeRolesFromUser("appuser", [
{ role: "dbAdmin", db: "mydb" }
])删除用户
javascript
db.dropUser("appuser")自定义角色
创建自定义角色
javascript
use admin
db.createRole({
role: "appReadWrite",
privileges: [
{
resource: { db: "mydb", collection: "" },
actions: ["find", "insert", "update", "remove"]
},
{
resource: { db: "mydb", collection: "system.indexes" },
actions: ["find"]
}
],
roles: []
})使用自定义角色
javascript
db.createUser({
user: "customuser",
pwd: "customPass",
roles: [
{ role: "appReadWrite", db: "admin" }
]
})查看角色信息
javascript
db.getRole("appReadWrite", { showPrivileges: true })删除角色
javascript
db.dropRole("appReadWrite")连接字符串中的认证
基本连接字符串
mongodb://username:password@localhost:27017/database?authSource=admin示例
javascript
// Node.js
const uri = "mongodb://appuser:appPassword456@localhost:27017/mydb?authSource=mydb";
// Python
client = MongoClient("mongodb://appuser:appPassword456@localhost:27017/mydb?authSource=mydb")
// Java
String uri = "mongodb://appuser:appPassword456@localhost:27017/mydb?authSource=mydb";最佳实践
1. 使用强密码
- 至少 12 个字符
- 包含大小写字母、数字和特殊字符
- 定期更换密码
2. 最小权限原则
- 只授予用户必要的权限
- 避免使用超级管理员角色
- 为不同应用创建独立用户
3. 网络安全
- 绑定到特定 IP 地址
- 使用防火墙限制访问
- 启用 SSL/TLS 加密
yaml
# mongod.conf
net:
bindIp: 127.0.0.1,10.0.0.5 # 限制访问IP
port: 27017
security:
authorization: enabled
keyFile: /path/to/keyfile # 副本集认证4. 定期审计
javascript
// 查看用户权限
db.getUsers()
// 查看角色权限
db.getRoles({ showPrivileges: true })总结
MongoDB 的用户管理功能提供了:
- 基于角色的访问控制(RBAC)
- 丰富的内置角色
- 自定义角色支持
- 灵活的用户权限管理
合理使用用户管理功能,可以有效保护数据库安全。
在下一章中,我们将学习 MongoDB 创建数据库。