Navicat连接MongoDB后报13 listDatabases错误,根本原因是用户缺少readAnyDatabase等admin库角色权限,且Navicat在连接时立即执行该命令,而mongosh依赖localhost例外机制可延迟认证。
navicat 连接 mongodb 后点不开数据库、左侧只显示 admin/local/config,却报 [13][unauthorized] command listdatabases requires authentication —— 这不是连接失败,而是当前用户没被授予列出所有数据库的权限。根本原因就一个:mongodb 要求执行 listdatabases 必须拥有特定角色,而 navicat 一连上就会立刻发这个命令(图形工具的默认行为),命令行却不会。
为什么 Navicat 一连就报错,mongosh 却能正常操作?
因为两者触发认证的时机和上下文完全不同:
- mongosh 在 localhost 连接时走的是「localhost exception」机制:即使 MongoDB 启用了
authorization: enabled,来自127.0.0.1的首次连接仍允许不带凭证直连,之后再手动use admin+db.auth()或直接执行命令(只要权限够) - Navicat 不管你连的是本地还是远程,一律按标准客户端处理:TCP 建连后立即发送
listDatabases,此时若未提前完成认证或用户无对应权限,MongoDB 直接拒掉,不给你补救机会 - 哪怕测试连接显示「成功」,那也只是 TCP 层通了、认证流程也走完了,但不代表你有
listDatabases权限 —— 测试连接不触发该命令
listDatabases 需要哪些具体角色?
必须在 admin 数据库中为用户分配以下任一角色(不能在业务库如 myapp 里赋):
-
readAnyDatabase(最小必要权限,推荐) readWriteAnyDatabasedbAdminAnyDatabase-
root(权限过大,生产环境不建议)
错误示范:db.createUser({user:'dev', pwd:'123', roles:['read']}) —— 这个 read 是针对某个具体库的,对 listDatabases 完全无效。正确写法是:
use admin
db.createUser({
user: 'navi-user',
pwd: 'xxx',
roles: [{ role: 'readAnyDatabase', db: 'admin' }]
})
Navicat 连接配置里最容易填错的三项
填错任意一项都会导致认证通过但权限失效:
-
Authentication Database(认证数据库):必须填
admin,不是你的业务库名,也不是留空。Navicat 默认设为admin,但有人手动改成test或myapp就挂了 -
用户名/密码大小写与特殊字符:MongoDB 用户名区分大小写;密码含
@、/、:等字符时,Navicat 可能未自动 URL 编码,建议改用简单密码临时验证 -
Authentication Mechanism(认证机制):MongoDB 6.0+ 默认用
SCRAM-SHA-256,老版 Navicat(v15 以前)只支持SCRAM-SHA-1,会静默降级失败。检查 Navicat 连接设置里是否勾选了SHA-256支持,或临时在服务端降级(不推荐)
云数据库(Atlas/阿里云/TencentDB)额外注意点
云环境默认更严格,光有角色还不够:
- Atlas 用户若用项目级账号(非 Organization Owner),
authSource得填admin,但角色得在 Atlas 控制台里单独给该用户加Project Read Only或更高,仅 MongoDB Shell 赋权无效 - 阿里云 MongoDB 要求白名单 IP + 公网地址开关双开启,且连接时
authSource必须是admin,填$external会直接报认证失败 - 所有云厂商强制 TLS,Navicat 中必须勾选
Use SSL并设为Require,否则连接后秒断,错误日志里可能只显示「connection closed」,实际是 TLS 握手失败
真正卡住人的地方往往不在角色创建,而在 Navicat 那几处看似无关紧要的下拉选项——尤其是认证数据库和 SSL 模式,改完必须点「测试连接」再「确定」,只点测试不保存配置照样报错。


















