开启认证后,mongosh必须显式指定--authenticationdatabase(如admin),密码含特殊字符需用单引号包裹,tls连接还需--tls和--tlscafile参数,否则均报权限错误而非网络问题。

开启认证后,mongosh必须显式提供凭证和认证数据库,否则会报 Authentication failed 错误——这不是网络不通,而是权限校验被拒。
连接时必须指定 --authenticationDatabase
开启 authorization: enabled 后,MongoDB 不再默认在当前数据库里查用户,而是在你指定的认证数据库中查找凭证。常见错误是只传 -u 和 -p,却漏掉 --authenticationDatabase:
- 管理员用户总在
admin库创建,所以绝大多数情况要加--authenticationDatabase admin - 普通业务用户可能建在自己的库(如
myapp),此时应写--authenticationDatabase myapp - URI 方式也一样:
mongodb://user:pass@host:27017/mydb?authSource=admin中的authSource参数就等价于--authenticationDatabase
密码含特殊字符时要用单引号包裹
Shell 会提前解析 $、!、& 等字符,导致实际传给 mongosh 的密码被截断或报错:
- 错:
mongosh -u alice -p abc$123 --authenticationDatabase admin→$123被当变量展开,传空密码 - 对:
mongosh -u alice -p 'abc$123' --authenticationDatabase admin - 更安全:用
passwordPrompt()交互输入,避免明文留在命令行历史里:mongosh -u alice --authenticationDatabase admin,然后在提示符下输密码
连接失败时先确认三件事
报 Failed to authenticate 或 not authorized on admin to execute command 时,别急着重试,先检查:
- 用户是否真存在:登录无认证的本地
mongosh --port 27017,执行use admin→db.getUsers()看用户名和角色是否匹配 - 角色是否足够:比如只给了
read角色,却尝试db.createUser(),就会被拒 - 服务端配置是否生效:确认
mongod是用启用了security.authorization: true的配置文件启动的,不是临时加参数但没 reload
SSL/TLS 连接必须配 --tls 和 --tlsCAFile
云厂商或自建 TLS 环境下,光有用户名密码不够,不加 TLS 参数会直连明文通道,多数生产环境会直接拒绝:
- 必须启用:
--tls(MongoDB 4.2+ 用--tls,旧版用--ssl) - CA 证书路径不能错:
--tlsCAFile /path/to/ca.pem,路径不存在或权限不足都会静默失败 - 内网自签名证书常需加
--tlsAllowInvalidHostnames(跳过域名验证),但切勿在公网环境用 - 双向认证还需
--tlsCertificateKeyFile指向客户端证书+密钥合并文件
最容易被忽略的是:认证数据库名写错、密码被 shell 解析、以及 TLS 参数缺失这三项——它们不会报“连接超时”,而是立刻返回模糊的权限错误,排查时容易绕远路。











