createUser 是什么
db.createUser 在指定库下创建账号并绑定角色:roles 数组里既可用内置角色(read、readWrite、dbAdmin、userAdmin、clusterMonitor 等),也可组合跨库角色。账号的认证库就是创建它的那个库,因此连接时要用 authSource 指明。启用访问控制需要配置 security.authorization: enabled 并重启实例。
基本信息
| 方法 | db.createUser({ user, pwd, roles }) |
|---|---|
| 常用角色 | read / readWrite / dbAdmin / userAdmin / clusterMonitor / root |
| 认证库 | 账号所在库即认证库,连接用 authSource 指定 |
| 跨库授权 | roles 里用 { role: "read", db: "other" } 形式 |
| 管理位置 | 管理层账号建议建在 admin 库集中管理 |
| 生效条件 | security.authorization: enabled,需重启进程 |
典型使用场景
- 给业务应用创建最小权限账号,单库只读或读写
- 给监控系统建 clusterMonitor 只读账号采集指标
- 给数据分析同学建只读账号做临时查询
- 多业务共用实例时按库隔离账号,降低影响面
- 备份工具使用 backup / restore 角色的专用账号
- 建临时巡检账号,任务结束后立即 drop
创建与维护账号
创建与维护账号
use admin
db.createUser({
user: "app_rw",
pwd: passwordPrompt(), # 交互输入,避免明文进历史
roles: [{ role: "readWrite", db: "app" }]
})
db.createUser({ user: "monitor", pwd: passwordPrompt(), roles: [{ role: "clusterMonitor", db: "admin" }] })
db.getUser("app_rw", { showPrivileges: true }) # 核对实际权限
db.updateUser("app_rw", { roles: [{ role: "readWrite", db: "app" }, { role: "read", db: "report" }] })
db.dropUser("app_rw") # 删除账号常用内置角色
| 角色 | 范围 | 说明 |
|---|---|---|
| read | 指定库 | 只读查询 |
| readWrite | 指定库 | 读写文档 |
| dbAdmin | 指定库 | 库级管理:索引与统计 |
| userAdmin | 指定库 | 库内账号管理 |
| clusterMonitor | 集群 | 只读监控指标 |
| root | 全局 | 超级权限,生产慎用 |
账号的认证库是创建它的库:建在业务库里的账号连接时必须带 authSource=业务库,否则只会报认证失败。
开启 authorization 之前先确认管理员账号可用,并在另一个窗口验证登录成功再重启,否则可能把自己锁在库外。
密码不要写进脚本或命令行;交互场景用 passwordPrompt(),自动化场景从环境变量或密钥管理系统注入。
权限核对与治理
- 用 db.getUser("账号", { showPrivileges: true }) 查看实际生效的权限
- 定期用 db.getUsers() 盘点账号清单,清理离职人员与废弃应用的账号
- 按环境区分账号名,避免测试凭据被误用到生产
- 密码轮换要配套:改密后同步更新应用配置,过渡期可保留双账号
- 关键库可开启审计日志记录认证与授权失败,便于定位异常登录
- 权限变更后用只读连接验证一次,确认不影响业务读写