在使用 Na vicat 连接 MongoDB 时,如果遇到了 authentication failed 错误,并且已经确认用户名、密码以及认证数据库均设置正确,那么问题大概率出在 SCRAM-SHA-256 协议与 Na vicat 版本不兼容上。此时最直接有效的解决方法是强制将 MongoDB 服务端的认证协议降级为 SCRAM-SHA-1——但请注意,这项操作必须在服务端配置中完成,仅修改客户端选项是无法生效的。

为什么必须修改 mongod.conf 配置文件?
MongoDB 从 4.0 版本开始支持 SCRAM-SHA-1,但从 6.0 版本起,系统默认强制启用 SCRAM-SHA-256,而且不再允许客户端通过协商方式降级。而 Na vicat ≤16.0.17 版本无法解析 SHA-256 的挑战响应,因此连接时直接被服务端拒绝,错误信息中不会明确指出机制不匹配,只会笼统地报出 Authentication failed。
关键点在于:这不是 Na vicat 的“选项”可以调整的,必须让 MongoDB 主动使用 SHA-1 签发凭证。
- 修改
/etc/mongod.conf(Linux)或mongod.cfg(Windows),在security部分添加如下配置:
security:
authorization: enabled
sasl:
hostName: your-hostname # 可选,若出现 SASL 错误再增加
serviceName: mongodb # 强制使用 SHA-1 认证机制
enableLocalhostAuthBypass: false
- 在
setParameter区块中显式指定(适用于 MongoDB ≥4.2):
setParameter: scramIterationCount: 10000 # 关键:禁用 SHA-256,仅保留 SHA-1 disableScramSHA256: true
- 保存文件后重启服务:
sudo systemctl restart mongod(Linux)或net stop MongoDB && net start MongoDB(Windows)
用户必须使用 SCRAM-SHA-1 方式重新创建
即使密码没有改变,只要用户是在 SHA-256 启用状态下创建的,存储的凭证哈希就是 SHA-256 格式。服务端降级配置后,原有的用户仍然无法识别,只能删除后重新创建。
- 先删除原用户(以
admin库为例):
use admin
db.dropUser("myuser")
- 再创建新用户,并明确指定认证机制(MongoDB 4.0+ 支持):
db.createUser({
user: "myuser",
pwd: "mypass",
roles: [{ role: "readWrite", db: "myapp" }],
mechanisms: ["SCRAM-SHA-1"] // 必须添加此行
})
- 验证配置是否生效:执行
db.getUser("myuser"),返回结果中应包含"mechanisms" : ["SCRAM-SHA-1"]
Na vicat 连接配置中“Authentication Database”字段不能留空
即使服务端已启用 SCRAM-SHA-1,如果 Na vicat 的 Authentication Database 字段为空或填写错误,仍然会报错。MongoDB 不会自动回退到 admin 库。
- 该字段值必须与用户创建时所在的数据库完全一致,注意大小写敏感
- 管理员用户一定是在
admin库创建的,因此此处必须填写admin - 普通业务用户若在
myapp库创建,则此处应填写myapp,而不是admin - Na vicat for MongoDB v16.0.17 及更早版本没有“认证机制”下拉菜单,它只识别 SHA-1 —— 因此只要服务端配置正确,客户端自然就能正常工作
此方案的代价与边界
启用 disableScramSHA256: true 后,所有新用户只能使用 SHA-1;已有的 SHA-256 用户会失效,必须重建。SHA-1 虽然仍被 MongoDB 官方支持,但 NIST 已建议弃用,长期在生产环境中使用存在合规风险。
真正彻底的解决方案是升级 Na vicat 到 v17 以上版本,这些版本原生支持 SHA-256。但如果受限于许可证或内部策略无法升级,那么服务端强制使用 SHA-1 就是改动范围最小、成功率最高的实践路径——不过请记住,每次新建用户都必须显式添加 mechanisms: ["SCRAM-SHA-1"],一旦遗漏就会再次无法连接。
