必须先启用security.authorization: enabled,否则db.createuser()创建的root用户无效;启动时未启用鉴权,用户虽创建成功但无权限控制效果。

必须先启用 authorization 才能创建并使用 root 用户,否则 db.createUser() 创建的用户无实际权限控制效果。
启动时未启用鉴权,db.createUser() 会成功但不生效
很多用户在刚装完 MongoDB 7.0 后直接连上 mongosh 就执行:
use admin
db.createUser({user:"admin", pwd:"123456", roles:[{role:"root", db:"admin"}]})
命令返回 “Successfully added user”,但随后用 db.auth("admin","123456") 却失败,或即使成功,其他客户端仍可免密连接 —— 这是因为服务端根本没开鉴权。
- 检查是否启用:打开配置文件(如
/etc/mongod.conf或C:\Program Files\MongoDB\Server\7.0\bin\mongod.cfg),确认存在且未被注释的段落:
security: authorization: enabled
- Windows 下若用命令行临时启动,需显式加参数:
mongod --config "C:\path\to\mongod.cfg" --bind_ip_all(注意:仅--auth已被弃用,MongoDB 7.0 要求用security.authorization) - Linux/macOS 启动前务必重载 systemd 配置:
sudo systemctl daemon-reload && sudo systemctl restart mongod
db.createUser() 必须在 admin 库下执行,且 roles 字段不能写错
root 角色只存在于 admin 数据库上下文中。在其它库(比如 test)里执行,即使语法没错,也会创建一个仅对该库有效的普通用户,和 root 完全无关。
- 正确流程:
use admin
db.createUser({
user: "admin",
pwd: "StrongPassw0rd!",
roles: [{ role: "root", db: "admin" }]
})
-
role: "root"是唯一能跨库管理的内置角色;userAdminAnyDatabase或dbAdminAnyDatabase不等价于 root,缺少对config、local等系统库的操作权 - 密码强度有最低要求:MongoDB 7.0 默认启用密码策略(尤其在启用了
security.authorization+security.enablePasswordPolicy: true时),至少 8 位、含大小写字母+数字+符号 - 如果提示
"UserNotFound"或"AuthenticationFailed",不是密码错,而是当前连接压根没进admin库 —— 检查use admin是否真的执行成功(返回值应为switched to db admin)
验证 root 权限是否真正可用,别只信 db.auth()
db.auth() 成功只代表认证通过,不代表你拥有所需权限。真正检验 root 是否就位,得做两件事:
- 退出当前 shell,用新凭据重连:
mongosh "mongodb://admin:StrongPassw0rd!@localhost:27017/admin?authMechanism=SCRAM-SHA-256" - 连上后立即试一条跨库操作,例如:
use test
db.foo.insertOne({x:1}) // 写入任意库的任意集合
use config
db.chunks.find().limit(1) // 查 config 库(非 root 权限无法访问)
- 如果第二步报
"not authorized",说明角色没给对,或配置文件里漏写了security.authorization: enabled导致权限系统未激活 - Docker 环境下特别注意:环境变量
MONGO_INITDB_ROOT_USERNAME创建的是内置 root,但它不会自动启用鉴权 —— 你仍需在容器启动参数中加--auth或挂载含security.authorization: enabled的配置文件
最常被忽略的一点:MongoDB 7.0 的 root 用户无法绕过 security.authorization 的开关逻辑。哪怕你把用户建在 admin 库、角色写对、密码够强,只要配置里没开 authorization,整个权限体系就是关闭状态 —— 此时所有连接都等效于本地管理员,root 用户形同虚设。











