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用户进行业务操作存在安全风险,建议为目标数据库创建独立权限用户:
- 进入MongoDB容器:
docker exec -it mongo-db mongosh -u paulmarcelinbejan -p PaulMarcelinBejanPassword --authenticationDatabase admin
- 切换到目标数据库并创建用户:
use HyperBankMongoDB db.createUser({ user: "hyperbank_user", pwd: "HyperBankUserPassword", roles: [ { role: "readWrite", db: "HyperBankMongoDB" } ] })
- 修改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
相关产品推荐
相关产品推荐

