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

Spring Boot微服务Docker环境MongoDB普通用户认证失败求助

Spring Boot微服务MongoDB普通用户认证失败(init-mongo.sh未执行)

问题概述

开发的Spring Boot微服务以Docker容器运行,使用MongoDB 6.0.2作为数据库。通过init-mongo.sh和stage_mongo.env创建Root用户与普通用户后,用Root用户能正常连接数据库,但用普通用户连接时触发认证失败错误,且后续发现init-mongo.sh脚本根本未执行。

错误信息

com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server mongodb:27017. The full response is {"ok": 0.0, "errmsg": "Authentication failed.", "code": 18, "codeName": "AuthenticationFailed"}  at com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:198) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:413) ~[mongodb-driver-core-4.6.0.jar!/:na]  at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:337) ~[mongodb-driver-core-4.6.0.jar!/:na] at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:101) ~[mongodb-driver-core-4.6.0.jar!/:na]   at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:45) ~[mongodb-driver-core-4.6.0.jar!/:na]    at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:230) ~[mongodb-driver-core-4.6.0.jar!/:na]    at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:137) ~[mongodb-driver-core-4.6.0.jar!/:na]

核心原因与解决方案

1. 清理MongoDB已有数据(脚本执行的前提)

MongoDB容器的docker-entrypoint-initdb.d目录下的初始化脚本仅在首次启动(/data/db目录为空)时执行一次。如果之前已经启动过MongoDB并生成了数据,脚本不会重复运行。
执行以下操作重置数据:

# 停止并移除容器
docker-compose down
# 删除本地挂载的MongoDB数据目录
rm -rf ../mongodb/db
# 重新启动容器
docker-compose up -d

2. 修复init-mongo.sh脚本(适配MongoDB 6.0+)

MongoDB 6.0及以上版本已移除旧的mongo命令行工具,改用mongosh,原脚本会因命令不存在而执行失败。修改后的脚本如下:

#!/bin/bash
mongosh -- "$MONGO_INITDB_DATABASE" <<EOF
    var rootUser = '$MONGO_INITDB_ROOT_USERNAME';
    var rootPassword = '$MONGO_INITDB_ROOT_PASSWORD';
    var admin = db.getSiblingDB('admin');
    admin.auth(rootUser, rootPassword);

    var user = '$MONGO_INITDB_USERNAME';
    var passwd = '$MONGO_INITDB_PASSWORD';
    db.createUser({user: user, pwd: passwd, roles: ["readWrite"]});
EOF

同时给脚本添加执行权限:

chmod +x ./init-mongo.sh

3. 验证普通用户是否创建成功

容器启动后,进入MongoDB容器检查用户状态:

# 用Root用户登录MongoDB
docker exec -it <你的mongodb容器名> mongosh -u someRootName -p someRootPassword --authenticationDatabase admin
# 切换到目标数据库
use someDatabaseName
# 查询当前库下的用户
db.getUsers()

如果能看到someName用户,说明创建成功;若未找到,检查数据目录是否清理干净、脚本是否存在语法错误。

4. 补全Spring Boot连接配置

确保Spring Boot的MongoDB连接配置完整,避免因参数缺失导致认证失败。修改stage_mongo_auth.env,推荐用URI方式配置:

spring_data_mongodb_uri=mongodb://someName:somePassword@mongodb:27017/someDatabaseName?authSource=someDatabaseName

或补全分散配置项:

spring_data_mongodb_username=someName
spring_data_mongodb_password=somePassword
spring_data_mongodb_database=someDatabaseName
spring_data_mongodb_authentication-database=someDatabaseName

5. 排查容器日志与环境变量

  • 查看MongoDB容器日志,确认脚本执行是否有报错:
    docker logs <你的mongodb容器名>
    
  • 验证MongoDB容器是否正确接收了环境变量:
    docker exec -it <你的mongodb容器名> env | grep MONGO_INITDB
    

内容的提问来源于stack exchange,提问作者Oleksandr Popov

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 06:26:28