Skip to content

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 创建数据库