
本文详解 Spring Boot 应用连接 MongoDB 时出现 AuthenticationFailed 异常(如 SCRAM-SHA-1 认证失败)的根本原因与系统性解决方法,涵盖 MongoDB 用户权限配置、连接 URI 正确写法、Spring Boot 配置最佳实践及常见陷阱规避。
本文详解 spring boot 应用连接 mongodb 时出现 `authenticationfailed` 异常(如 `scram-sha-1` 认证失败)的根本原因与系统性解决方法,涵盖 mongodb 用户权限配置、连接 uri 正确写法、spring boot 配置最佳实践及常见陷阱规避。
在 Spring Boot 项目中集成 MongoDB 时,若启动报错 Exception authenticating MongoCredential 或 Authentication failed.(错误码 18),本质并非代码缺陷,而是认证上下文不匹配——最常见原因是:MongoDB 用户创建时指定的 authSource(认证数据库)与 Spring Boot 连接时默认或显式指定的 authSource 不一致。
? 核心问题定位:authSource 必须显式对齐
MongoDB 的用户凭证存储在特定数据库中(通常是 admin),而非业务数据库本身。当使用用户名 rootuser 尝试访问数据库 abc 时,若该用户是在 admin 数据库中创建的,但连接字符串未声明 authSource=admin,驱动会默认在 abc 库中查找用户凭据,从而导致认证失败:
MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='abc', ...}
→ 此处 source='abc' 表明驱动正尝试在 abc 库中验证用户,但实际用户注册在 admin。
✅ 正确解决方案(推荐分步操作)
1. 确认用户存在位置与权限
进入 MongoDB Shell(mongosh),检查用户归属:
# 切换到 admin 数据库查看所有用户
use admin
db.system.users.find({ user: "rootuser" }, { user: 1, db: 1, roles: 1 }).pretty()
若返回为空,说明用户不存在或不在 admin;若存在但 db: "abc",则该用户仅限在 abc 库内认证(需确保连接时 authSource=abc)。
2. 创建专用数据库用户(强烈推荐)
避免使用 admin 用户直连业务库,为 abc 数据库创建专属用户:
// 在 mongosh 中执行
use abc
db.createUser({
user: "appuser",
pwd: "StrongPass123!",
roles: [
{ role: "readWrite", db: "abc" } // 最小权限原则
]
})
✅ 此用户认证源即为 abc,后续连接无需额外指定 authSource。
3. Spring Boot 配置方式(二选一)
方式一:使用标准配置项(清晰可维护)
# application.yml
spring:
data:
mongodb:
host: localhost
port: 27017
username: appuser
password: StrongPass123!
database: abc
# authSource 默认为 database 值(即 abc),与 createUser 一致 → ✅ 有效
方式二:使用完整 URI(显式控制 authSource)
spring:
data:
mongodb:
uri: mongodb://appuser:StrongPass123!@localhost:27017/abc?authSource=abc&tls=false
⚠️ 注意:若用户在 admin 创建,必须写 authSource=admin;若在 abc 创建,则 authSource=abc(可省略,默认同 database)。
4. 检查 MongoDB 服务配置(远程部署必备)
若连接远程 MongoDB,请确认 /etc/mongod.conf 允许外部访问:
net: port: 27017 bindIp: 127.0.0.1,0.0.0.0 # 或指定应用服务器 IP security: authorization: enabled # 必须开启
修改后重启服务:sudo systemctl restart mongod
? 常见错误与避坑指南
- ❌ 错误示例 URI:mongodb://rootuser:pwd@localhost/abc
→ 缺少 authSource=admin,且未指定端口,易失败。 - ❌ 在 application.yml 中同时配置 uri 和 host/username/password
→ Spring Boot 优先使用 uri,其余字段被忽略,易造成配置矛盾。 - ❌ 使用过期的 spring.data.mongodb.host 等属性(Spring Boot 3+ 推荐统一用 uri 或明确 authSource)
→ 若用传统配置,确保 Spring Data MongoDB 版本 ≥ 4.0 且与 Boot 3.x 兼容。
✅ 验证连接是否成功
添加简易健康检查:
@Component
public class MongoHealthChecker implements CommandLineRunner {
@Autowired private MongoTemplate mongoTemplate;
@Override
public void run(String... args) {
try {
String version = mongoTemplate.getDb().runCommand(new Document("buildInfo", 1))
.getString("version");
System.out.println("✅ MongoDB connected successfully. Version: " + version);
} catch (Exception e) {
System.err.println("❌ MongoDB connection failed: " + e.getMessage());
}
}
}
通过以上步骤,90% 的 AuthenticationFailed 问题可彻底解决。核心原则始终是:用户在哪建,authSource 就指向哪。坚持最小权限原则创建专用用户,并显式管理认证上下文,即可构建安全、稳定的 Spring Boot + MongoDB 生产级连接。











