You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Boot调用API插入Docker中MongoDB时认证失败问题

问题排查与解决方案

核心问题定位

从错误日志和MongoClient初始化日志可明确:

  • Spring Boot应用使用的MongoCredential中,认证来源数据库为HyperBankMongoDB
  • 通过MONGO_INITDB_ROOT_USERNAME创建的root用户,默认存储在admin数据库中,仅能通过admin库完成认证

这就是认证失败(错误码18)的根本原因:用root用户尝试在HyperBankMongoDB库认证,但该用户并不存在于这个数据库内。

解决方案

方案1:修改Spring Boot配置,指定认证数据库为admin

在配置文件(或配置中心的对应配置)中添加认证数据库指定:

# MongoDB配置示例
spring.data.mongodb.host=my-mongo-db
spring.data.mongodb.port=27017
spring.data.mongodb.database=HyperBankMongoDB
spring.data.mongodb.username=paulmarcelinbejan
spring.data.mongodb.password=PaulMarcelinBejanPassword
# 指定认证数据库为admin
spring.data.mongodb.authentication-database=admin

方案2:为HyperBankMongoDB创建专用业务用户(推荐)

直接使用root用户进行业务操作存在安全风险,建议为目标数据库创建独立权限用户:

  1. 进入MongoDB容器:
docker exec -it mongo-db mongosh -u paulmarcelinbejan -p PaulMarcelinBejanPassword --authenticationDatabase admin
  1. 切换到目标数据库并创建用户:
use HyperBankMongoDB
db.createUser({
  user: "hyperbank_user",
  pwd: "HyperBankUserPassword",
  roles: [
    { role: "readWrite", db: "HyperBankMongoDB" }
  ]
})
  1. 修改Spring Boot配置,使用该专用用户:
spring.data.mongodb.host=my-mongo-db
spring.data.mongodb.port=27017
spring.data.mongodb.database=HyperBankMongoDB
spring.data.mongodb.username=hyperbank_user
spring.data.mongodb.password=HyperBankUserPassword

额外修复:MongoDB健康检查配置

当前MongoDB的健康检查命令未携带认证参数,会导致健康检查结果不准确(容器显示运行,但实际需认证才能操作),修改如下:

# 在mongo-db服务的healthcheck节点替换test命令
healthcheck:
  test: ["CMD", "mongosh", "--eval", "db.getCollectionNames()", "-u", "paulmarcelinbejan", "-p", "PaulMarcelinBejanPassword", "--authenticationDatabase", "admin"]
  interval: 10s
  timeout: 5s
  retries: 4

内容的提问来源于stack exchange,提问作者Paul Marcelin Bejan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 17:52:05