必须先启用authorization并重启服务,再通过localhost免认证连接admin库创建用户;客户端连接时必须显式指定authsource=admin,否则报unauthorized。

必须先改配置再建用户,顺序错了连接就失败——mongod 启用 authorization: enabled 后不重启,或重启前就建了用户,都会导致 Authentication failed 或 Unauthorized 错误。
确认 MongoDB 5.0 已启用 authorization 并重启服务
SCRAM-SHA-256 不是“开关式”功能,它依赖服务端强制开启授权。没启用 authorization,建再多用户也没用。
- 检查
/etc/mongod.conf(Linux)或mongod.cfg(Windows),确保security段落存在且含:security:<br> authorization: enabled
- 不能只
sudo systemctl reload mongod,必须sudo systemctl restart mongod - 验证是否生效:
mongo --host 127.0.0.1 --port 27017连上后执行db.runCommand({getParameter: 1, authorization: 1}),返回值中authorization应为true - Docker 用户注意:
MONGO_INITDB_ROOT_USERNAME等环境变量只在首次初始化时建用户;若已初始化过,这些变量无效,必须手动进 shell 建用户
用本地无认证方式创建第一个 admin 用户
重启后、建用户前,mongod 处于“有授权但无用户”状态,此时只能用本地 socket 或 --host 127.0.0.1 绕过认证连入(Unix socket 默认允许 localhost 免密)。
- 执行:
mongosh --host 127.0.0.1 --port 27017(不是mongo,新版推荐mongosh) - 切库:
use admin - 建用户(必须在
admin库):db.createUser({<br> user: "svc-app",<br> pwd: "strong_pass_2026",<br> roles: [{role: "readWrite", db: "myapp"}]<br>}) - 别用
db.addUser()(已废弃),也别在myapp库里建用户——那样authSource就得配成myapp,但多数驱动默认不查那里
客户端连接必须显式指定 authSource=admin
MongoDB 不会默认去 admin 查凭证,哪怕你用户名叫 admin。漏掉 authSource 是 Unauthorized 最常见原因。
- 连接字符串示例:
mongodb://svc-app:strong_pass_2026@localhost:27017/myapp?authSource=admin - Robo 3T / Compass 中,“Authentication Database”字段必须填
admin,不能空、不能填myapp - Spring Boot 配置:
spring.data.mongodb.uri=mongodb://svc-app:strong_pass_2026@localhost:27017/myapp?authSource=admin - Go 驱动建议显式设
AuthMechanism:credential := options.Credential{<br> AuthMechanism: "SCRAM-SHA-256",<br> AuthSource: "admin",<br> Username: "svc-app",<br> Password: "strong_pass_2026"<br>}
避免中间件降级到 SCRAM-SHA-1 导致协商失败
虽然 MongoDB 5.0 默认支持 SCRAM-SHA-256,但某些代理(如 Mongos、Nginx TCP proxy)、旧版驱动或容器网络层可能过滤 saslSupportedMechs 响应,导致客户端 fallback 到 SHA-1,而服务端若禁用了 SHA-1 就直接拒连。
- 检查服务端是否禁用 SHA-1(生产环境推荐):
db.runCommand({listCommands: 1})查看saslSupportedMechs字段是否含SCRAM-SHA-1 - Java 驱动需确认未调用
com.mongodb.MongoClientSettings.builder().applyToSslSettings(...)禁用 SHA-256 - 容器部署时,确保
mongod容器内网互通,且代理未做 SASL 层拦截 - 测试命令行直连排除中间件:
mongosh "mongodb://svc-app:strong_pass_2026@localhost:27017/myapp?authSource=admin&authMechanism=SCRAM-SHA-256"
最容易被忽略的点:建用户和写连接字符串是两件事,且都必须对准 admin 库;authSource 不是可选参数,而是认证流程的必填定位符。一旦漏掉,错误提示永远是 Unauthorized,而不是“找不到用户”。











