超级管理员必须在admin库中创建且显式指定{role:"root",db:"admin"},否则角色无效;创建后须在配置文件启用security.authorization: enabled并重启服务,连接时必须指定--authenticationDatabase=admin或URI中添加authSource=admin。

超级管理员必须建在 admin 数据库上
不是“随便进个库 run 一下 db.createUser”就行。MongoDB 的 root 角色只在 admin 库中有效,且该角色要求用户验证库(authentication database)就是 admin。如果在 test 或 myapp 库里执行创建命令,roles: ["root"] 会被忽略或报错 —— 因为角色作用域不匹配。
正确做法只有一步:use admin,再执行创建。没这步,后续所有权限都无效。
db.createUser 中 roles 字段写法不能省略 db
虽然文档说 db 字段可省略(默认为当前库),但对 root 角色,显式写明更安全。常见错误写法:{user:"root", pwd:"xxx", roles:["root"]} —— 这在旧版本可能侥幸成功,但在 4.4+ 版本及严格模式下会失败,因为 root 是“全局角色”,必须绑定到 admin 库。
推荐写法:
db.createUser({
user: "root",
pwd: "your_strong_password",
roles: [{ role: "root", db: "admin" }]
})
注意:roles 是数组,每个元素是对象;role 和 db 必须成对出现。
创建后必须重启 MongoDB 并启用 auth
账号创建只是第一步。MongoDB 默认不启用认证,即使你建了 root,服务仍以无鉴权模式运行。必须修改配置文件(如 /etc/mongod.conf)并重启:
- 找到
security:段,添加authorization: enabled - 或旧版配置中把
#auth = true取消注释(注意不是noauth) - 执行
sudo systemctl restart mongod(Linux)或重新启动服务
不重启,db.auth() 永远返回 1(伪成功),实际所有连接都不受控。
验证时必须指定 --authenticationDatabase admin
用命令行登录测试时,很多人直接 mongo -u root -p,结果报 Authentication failed。这是因为客户端默认尝试在 test 库做验证,而 root 的验证库是 admin。
正确命令:
mongo --host localhost --port 27017 -u root -p --authenticationDatabase admin
在应用连接字符串里也一样:URI 中必须带 ?authSource=admin,例如:mongodb://root:pwd@localhost:27017/mydb?authSource=admin。
漏掉 authSource 是生产环境最常踩的坑,错误信息模糊,容易误判为密码错或账号不存在。











