mongodb默认不启用权限控制,需先停用认证创建admin库的root用户,再启用security.authorization: enabled;登录时必须指定--authenticationdatabase admin,否则因认证库错误导致unauthorized。

MongoDB 默认不启用权限控制,一旦你在 mongod.conf 里写了 security.authorization: enabled 或旧版的 auth=true,所有连接立刻被拒——但此时你还没创建任何用户,直接就进不去了。必须先停掉认证、创建管理员、再开认证,顺序错了就卡死。
怎么创建能管所有库的 root 用户
root 用户必须建在 admin 数据库下,且角色必须指定 db: "admin"。不能在别的库(比如 test)里用 {role: "root", db: "admin"},那会报错 RoleNotFound。
- 先关闭
mongod,临时注释掉配置里的authorization: enabled,重启服务 - 连上后执行:
use admin db.createUser({ user: "root", pwd: "your_strong_password", roles: [{role: "root", db: "admin"}] }) - 改回配置,重启
mongod - 登录时必须显式指定认证库:
mongo -u root -p --authenticationDatabase admin
为什么用 readWriteAnyDatabase 还是查不到某个库
因为 readWriteAnyDatabase 只给「数据读写」权限,不包含 listDatabases。你执行 show dbs 或 db.adminCommand({listDatabases: 1}) 时,实际需要的是 clusterMonitor 或 readAnyDatabase + listDatabases 组合权限。
- 只想要看库名+读所有库?用
{role: "readAnyDatabase", db: "admin"}+{role: "clusterMonitor", db: "admin"} - 应用账号别用
*AnyDatabase类角色,应限定到具体库,比如{role: "readWrite", db: "myapp"} - 角色必须在
admin库创建,但权限可以作用于其他库——db字段只是声明角色归属,不是限制作用域
db.createUser() 的 roles 数组容易漏的关键点
一个用户可以有多个角色,但每个角色对象里的 db 必须写对。比如你想让用户既能管 userAdmin 又能读 orders 库,得这么写:
roles: [
{role: "userAdmin", db: "admin"},
{role: "read", db: "orders"}
]
而不是合并成一个对象。另外:
– userAdmin 和 userAdminAnyDatabase 都只能在 admin 库生效
– 自定义角色必须先用 db.createRole() 创建,且同样要指定 db
– 角色名大小写敏感,readwrite(小写)无效,必须是 readWrite
权限生效后连不上?检查这三处
常见报错如 Authentication failed 或 Unauthorized,往往不是密码错,而是路径不对:
- 客户端没传
--authenticationDatabase admin,默认去当前库(比如test)找用户,当然找不到 - 用 GUI 工具(如 Studio 3T、MongoDB Compass)时,「Authentication Database」字段必须手动填
admin,不能留空或填错 - 连接字符串里没加
authSource=admin,例如:mongodb://user:pass@localhost:27017/mydb?authSource=admin
权限模型本身不复杂,但 admin 库的中心地位、角色与认证库的分离、以及命令行/连接串/配置三端参数不一致,才是实际踩坑最多的地方。











