mongosecurityexception表明认证环节失败,主因是authsource未显式指定或与用户所在数据库不一致;必须在连接字符串中添加?authsource=admin(若用户建于admin库),并确认mongod已启用authorization及驱动版本兼容scram-sha-256。

MongoSecurityException 出现时,基本可以断定是认证环节卡住了——不是密码错,而是“找不对地方验证”。Spring Boot 默认不指定 authSource,会去你连的那个数据库(比如 myapp)里查用户,但 MongoDB 实际把用户信息存在 admin 库里。结果就是:用户名密码全对,照样报 Authentication failed。
必须显式配置 authSource=admin
哪怕你用的是 Atlas、本地单机或副本集,只要启用了认证(authorization: enabled),就必须告诉驱动“去哪验”。URI 中漏掉 &authSource=admin 是最常见原因。
- 错误写法:
mongodb://user:pass@localhost:27017/mydb→ 驱动默认去mydb查用户,找不到就失败 - 正确写法:
mongodb://user:pass@localhost:27017/mydb?authSource=admin - 若用
spring.data.mongodb.uri配置,authSource必须作为查询参数拼在 URI 末尾;不能靠username/password单独配置项自动补上 - Atlas 用户注意:
mongodb+srv://URI 同样需要加&authSource=admin,否则 DNS SRV 解析后仍会丢掉该参数
确认用户确实建在 admin 数据库下
用户创建位置和 authSource 必须一致。很多人在目标库(如 myapp)里建了用户,却让驱动去 admin 验证,自然失败。
- 进 mongo shell,先切到
admin:use admin - 查当前用户:
db.system.users.find()—— 确认你要用的用户_id是"admin.username"格式,不是"myapp.username" - 如果用户建在
myapp库,要么改authSource=myapp,要么删掉重建:use myapp→db.dropUser("xxx")→db.createUser({...}) - 角色权限要匹配:至少给
{role: "readWrite", db: "myapp"},不能只给dbOwner却连错库
检查 MongoDB 是否真开启了 authorization
看起来配了认证,其实没生效——这是静默故障,日志里几乎不报错,但所有带权限的操作都会失败。
- Linux 下运行:
ps aux | grep mongod,确认启动命令含--auth或配置文件有security.authorization: enabled - 进 shell 执行:
db.runCommand({connectionStatus: 1}),看返回中authInfo.authenticatedUsers是否非空 - Docker 用户注意:
docker run mongo --auth会被官方镜像 entrypoint 覆盖,必须用-e MONGO_INITDB_ROOT_USERNAME+ 自定义配置文件 - YAML 配置缩进必须严格:
security:和authorization: true是同一级,多一个空格就失效
避免驱动版本与认证机制不兼容
Spring Boot 2.2+ 默认支持 SCRAM-SHA-256,但老版本 MongoDB(如 3.6)默认用 SCRAM-SHA-1,而某些驱动版本没开对应机制。
- URI 中可强制指定:
?authMechanism=SCRAM-SHA-1(MongoDB ?authMechanism=SCRAM-SHA-256(4.0+) - 不建议降级认证机制,优先升级驱动:确保
spring-boot-starter-data-mongodb版本 ≥ 2.4,对应mongodb-driver-sync≥ 4.3 - 如果用独立
MongoClient实例,需手动设置凭证:MongoCredential.createScramSha256Credential(...) - 别混用配置方式:URI 里写了
username/password,就别再单独配spring.data.mongodb.username,后者会被忽略且易引发歧义
admin 库里找用户,你却把用户建在业务库里;或者 mongod 压根没开 authorization,只是假装开了。先跑通 db.auth() 再配 Spring Boot,比对着报错日志猜强得多。











