必须用uri配置带认证的MongoDB,因Spring Boot 2.4+已废弃独立username/password等配置,且uri能显式指定必需的authSource和authMechanism,避免认证失败、权限不足等问题。

spring.data.mongodb.uri 是最直接、最不容易出错的配置方式,尤其在启用认证时。用它替代分散的 host/port/username 等字段,能避免参数错位、authSource 被忽略等常见问题。
为什么必须用 uri 配置带认证的 MongoDB?
Spring Boot 2.4+ 版本中,spring.data.mongodb.username、password 等独立配置项已被标记为废弃(deprecated),且在某些版本里完全失效。更关键的是,它们无法显式指定 authSource(认证数据库)和 authMechanism(认证机制),而这两者在开启认证后是强制必需的。
常见错误现象包括:
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential- 连接成功但查不到数据,或写入报
not authorized on xxx to execute command - 本地能连,上生产环境就失败——往往因为生产 MongoDB 使用了
SCRAM-SHA-256,而默认机制是SCRAM-SHA-1
uri 字符串里哪些参数不能省?
一个可用的带认证 uri 至少包含三部分:用户凭据、目标数据库、认证源。格式为:
mongodb://<username>:<password>@<host>:<port>/<database>?authSource=<auth_db>&authMechanism=SCRAM-SHA-256
必须明确指定:
-
authSource=admin:认证凭据所在的数据库(不是你操作的业务库)。MongoDB 用户是在某个库下创建的,比如db.createUser(..., { roles: [{ role: "readWrite", db: "myapp" }] }),但认证仍需指向其所属的admin或对应库 -
authMechanism=SCRAM-SHA-256:新版 MongoDB(4.0+ 默认)要求此机制;若省略,Spring Boot 可能降级使用SCRAM-SHA-1,导致认证失败 - 密码中若含特殊字符(如
@、/、:),必须 URL 编码,否则解析会截断——例如pa@ss/word应写成pa%40ss%2Fword
集群或副本集怎么配?
单节点和多节点的 uri 写法本质一致,只是 host 部分变成逗号分隔:
mongodb://user:pass@node1:27017,node2:27017,node3:27017/mydb?authSource=admin&authMechanism=SCRAM-SHA-256&replicaSet=rs0
注意:
- 所有节点都必须启用认证,且用户在
authSource指定的库中存在 - 如果集群启用了 TLS/SSL,还需追加
&ssl=true,并确保 JVM 信任对应证书 -
replicaSet参数名大小写敏感,必须全小写;值(如rs0)要和 MongoDB 实际配置一致,否则连接后无法自动故障转移
application.yml 和 application.properties 哪个更稳妥?
选 application.yml。因为 uri 含大量 &、=、/,在 .properties 中容易因换行或转义出错。yml 天然支持长字符串,且缩进清晰:
spring:
data:
mongodb:
uri: mongodb://admin:admin123@192.168.1.10:27017/myapp?authSource=admin&authMechanism=SCRAM-SHA-256
特别提醒:& 在 yml 中必须用 &(即 HTML 实体),不能直接写 &,否则 YAML 解析器会报错;IDE 通常会自动转义,但手写时务必留意。
uri 里写了 /myapp,但用户只在 admin 库下创建且角色是 { role: "root", db: "admin" },那它对 myapp 库依然无权读写——得额外执行 db.grantRolesToUser("admin", [{ role: "readWrite", db: "myapp" }])。

















