你这个报错的本质是:Navicat 连接上了 MongoDB,但当前登录用户没有权限在 admin 库执行 listDatabases(Navicat 会自动去拉取库列表,所以一上来就触发了这个命令),于是弹:
[13] Unauthorized not authorized on admin to execute command { listDatabases: 1, nameOnly: true }
一、最常见原因:你没填账号或填的账号权限不够
1)用 root / readAnyDatabase 权限的账号连接
MongoDB 想列出所有库(listDatabases),至少要有这些之一:
root(最省事)readAnyDatabase(只读也能列库)clusterMonitor+ 相关库权限(不建议你折腾这个)
建议直接建一个 root 管理账号,然后 Navicat 用它连。
二、创建管理员账号(MongoDB 3.4 适用)
前提:你要能在服务器上进
mongo命令行(SSH / 远程桌面都行)
情况 A:你现在 MongoDB 还没开鉴权(authorization 关闭)
直接执行:
mongo --port 27018
use admin
db.createUser({
user: "admin",
pwd: "你的强密码",
roles: [ { role: "root", db: "admin" } ]
})
然后 Navicat 里填写:
- 用户名:admin
- 密码:你的强密码
- Authentication Database(认证库 / authSource)选:admin(非常关键)
情况 B:你已经开了鉴权,但目前没可用管理员账号(常见于装完就改配置)
你需要临时关闭鉴权或用本地免密方式启动一次来补账号。
方式 1:临时注释授权(推荐)
编辑 mongod.conf(不同系统路径不同,常见:/etc/mongod.conf 或 /etc/mongod/mongod.conf):
把这段改掉(或注释):
security:
authorization: enabled
重启 MongoDB 后,按“情况 A”创建用户;创建完再把 authorization 改回 enabled 再重启。
三、Navicat 连接时最容易漏的点:authSource(认证库)必须对
你的用户如果是建在 admin 库(99% 都是),Navicat 必须设置:
- 认证数据库(Authentication Database / authSource)= admin
否则你即使账号密码对,也可能出现各种 not authorized / auth failed。
四、你只想看某个库,不想让 Navicat 去 “列出全部库”(绕开 listDatabases)
如果你手里账号只有某个业务库权限(没有 listDatabases 权限),那就两条路:
路线 1:给该用户补一个 readAnyDatabase
在 admin 库给它加:
use admin
db.grantRolesToUser("你的用户名", [ { role: "readAnyDatabase", db: "admin" } ])
路线 2:Navicat 里关闭“显示全部数据库 / 获取库列表”的行为
不同 Navicat 版本入口不完全一样,但核心是:
- 不要让它连上就枚举所有库
- 或在连接属性里指定默认数据库为你的业务库
(如果你告诉我 Navicat 版本号/连接配置页截图,我可以精确指出勾选项在哪。)
五、顺手排查:你到底是“没账号”还是“权限不足”?
在服务器上用你当前账号测试一下:
mongo --port 27018 -u 用户名 -p 密码 --authenticationDatabase admin
进去后执行:
db.runCommand({ connectionStatus: 1 })
db.runCommand({ listDatabases: 1, nameOnly: true })
- 如果
connectionStatus里authenticatedUsers为空:说明没认证成功(多半 authSource 填错) - 如果认证成功但
listDatabases报 13:说明就是权限不足(按上面给 roles)
更加具体解决方式:
