MongoDB 用户管理全解析
(MongoDB 8.0+ 最新实践,2025 年)
MongoDB 的用户管理基于 RBAC(Role-Based Access Control,角色访问控制),所有用户必须在 admin 数据库创建,权限通过 角色(Role) 分配。
默认安装 未启用认证,生产环境 必须开启。
一、核心概念速览
| 概念 | 说明 |
|---|---|
| User | 用户,绑定到特定数据库 |
| Role | 角色,定义一组权限(如 read, readWrite) |
| Database | 用户创建在哪个库,就从该库认证(推荐 admin) |
| Authentication | 认证方式:SCRAM(默认)、x.509、LDAP、Kerberos |
| Authorization | 权限控制,开启后未登录用户只能访问 test 库 |
二、启用用户认证(必须)
1. 修改配置文件 mongod.conf
# /etc/mongod.conf (Linux) 或 Homebrew 路径
security:
authorization: enabled # 关键:开启权限控制
net:
port: 27017
bindIp: 127.0.0.1 # 生产建议 0.0.0.0 + 防火墙
2. 重启 MongoDB
sudo systemctl restart mongod # Linux
brew services restart mongodb-community@8.0 # macOS
三、创建用户(推荐在 admin 库)
1. 连接本地(首次无认证)
mongosh
2. 创建管理员用户(root 权限)
use admin
db.createUser({
user: "admin",
pwd: "YourStrongP@ssw0rd2025!",
roles: [ "root" ] // 等价于所有数据库的 dbAdmin + readWrite + userAdmin
})
安全建议:
- 密码 ≥ 12 位,含大小写+数字+符号
- 不要用
admin作为日常用户
四、常用内置角色(Built-in Roles)
| 角色 | 权限 | 适用场景 |
|---|---|---|
read | 只读 | 报表、监控 |
readWrite | 读写 | 应用连接 |
dbAdmin | 管理集合/索引 | 运维 |
userAdmin | 管理用户 | 安全管理员 |
clusterAdmin | 管理集群 | 分片/副本集 |
root | 超级用户 | 初始管理员 |
backup / restore | 备份恢复 | 运维工具 |
五、创建业务用户(推荐最小权限原则)
示例:为 company 数据库创建应用用户
use company
db.createUser({
user: "app_user",
pwd: "AppP@ss2025!",
roles: [
{ role: "readWrite", db: "company" }, // 只对 company 库读写
{ role: "read", db: "logs" } // 可读日志库
]
})
示例:只读用户(报表)
use reporting
db.createUser({
user: "report_user",
pwd: "Report123!",
roles: [ { role: "read", db: "company" } ]
})
六、用户管理常用命令
| 操作 | 命令 |
|---|---|
| 查看用户 | db.getUsers() 或 show users |
| 修改密码 | db.changeUserPassword("username", "newpass") |
| 更新角色 | db.updateUser("username", { roles: [...] }) |
| 删除用户 | db.dropUser("username") |
| 查看当前用户 | db.runCommand({connectionStatus: 1}) |
// 示例:给 app_user 增加 backup 权限
db.updateUser("app_user", {
roles: [
{ role: "readWrite", db: "company" },
{ role: "backup", db: "admin" }
]
})
七、连接认证用户
1. 命令行连接
mongosh -u admin -p --authenticationDatabase admin
# 或
mongosh "mongodb://admin:pass@localhost:27017/admin"
2. 连接字符串(URI)
# 标准连接
mongodb://app_user:AppP@ss2025!@localhost:27017/company
# Atlas 云数据库
mongodb+srv://user:pass@cluster0.xxxxx.mongodb.net/myDB
注意:特殊字符需 URL 编码(如
@→%40)
八、自定义角色(Custom Roles)
当内置角色不满足需求时,可自定义:
use admin
db.createRole({
role: "logManager",
privileges: [
{
resource: { db: "logs", collection: "" },
actions: [ "find", "insert", "remove", "createIndex" ]
}
],
roles: [] // 可继承其他角色
})
// 分配给用户
db.createUser({
user: "log_app",
pwd: "log123",
roles: [ "logManager" ]
})
九、生产环境最佳实践
| 实践 | 说明 |
|---|---|
所有用户在 admin 创建 | 便于统一管理 |
| 最小权限原则 | 应用只给 readWrite 当前库 |
| 定期轮换密码 | 每 90 天更换 |
| 禁用默认用户 | 删除 test 库用户 |
| 启用审计日志 | 记录登录、操作 |
| 使用 TLS/SSL | 加密传输 |
| IP 白名单 | 防火墙限制来源 |
启用审计(mongod.conf)
auditLog:
destination: file
path: /var/log/mongodb/audit.log
filter: '{ atype: { $in: ["authCheck", "authenticate"] } }'
十、常见问题排查
| 问题 | 解决方案 |
|---|---|
Unauthorized | 检查用户名、密码、认证库(--authenticationDatabase) |
not authorized on admin to execute command | 用户无对应权限,检查 roles |
UserNotFound | 用户不存在,用 show users 确认 |
| 连接超时 | 检查 bindIp、firewall、MongoDB 是否运行 |
十一、用户管理脚本示例
// create_users.js
use admin
// 管理员
db.createUser({
user: "admin",
pwd: "Admin2025!",
roles: ["root"]
})
// 应用用户
use ecommerce
db.createUser({
user: "shop_app",
pwd: "Shop@2025",
roles: [{ role: "readWrite", db: "ecommerce" }]
})
// 只读用户
use analytics
db.createUser({
user: "bi_user",
pwd: "BI@2025",
roles: [{ role: "read", db: "ecommerce" }]
})
print("所有用户创建完成!")
运行:
mongosh create_users.js
十二、GUI 工具管理用户
| 工具 | 支持 |
|---|---|
| MongoDB Compass | 创建/编辑/删除用户 |
| MongoDB for VS Code | 图形化用户管理 |
| MongoDB Atlas | Web 界面管理 |
总结:用户管理三步曲
graph TD
A[1. 开启 authorization] --> B[2. 创建 admin 用户]
B --> C[3. 创建业务用户(最小权限)]
C --> D[4. 应用使用连接字符串登录]
安全口诀:
“admin 建用户,业务最小权,认证必开启,密码要复杂”
如需 LDAP/Kerberos 集成、多租户用户隔离、自动化用户轮换脚本 或 从 MySQL 迁移用户体系,欢迎继续提问!