使用Docker Compose连接Spring Boot应用与MongoDB时出现认证失败错误:无法找到指定数据库中的用户
这个问题我之前帮朋友排查过,核心原因就是MongoDB在指定的user_db数据库里找不到你创建的user用户,咱们一步步来解决:
确认用户创建的数据库是否正确
MongoDB的用户是和数据库绑定的,你必须在user_db数据库下创建user用户,而不是默认的admin库。如果是用初始化脚本创建用户,脚本内容应该是这样的:use user_db db.createUser({ user: "user", pwd: "your_password", roles: [{ role: "readWrite", db: "user_db" }] })要是你在
admin库创建了用户,即使给了user_db的权限,认证时也会找不到,因为默认认证源是admin。检查Docker Compose的MongoDB配置
确保你在MongoDB的服务配置里指定了初始化数据库为user_db,这样初始化脚本会自动在这个库执行:services: mongodb: image: mongo:latest environment: - MONGO_INITDB_DATABASE=user_db - MONGO_INITDB_ROOT_USERNAME=root - MONGO_INITDB_ROOT_PASSWORD=root_pwd volumes: - ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo.js这里的
MONGO_INITDB_DATABASE是关键,没设置的话,初始化脚本会跑到admin库去创建用户,自然会出现找不到的错误。修正Spring Boot的连接配置
你的Spring Boot连接字符串必须明确指定认证源为user_db,不然MongoDB会默认去admin库找用户。比如在application.yml里:spring: data: mongodb: uri: mongodb://user:your_password@mongodb:27017/user_db?authSource=user_db或者用分开的配置项:
spring: data: mongodb: host: mongodb port: 27017 database: user_db username: user password: your_password authentication-database: user_db重点是
authSource或者authentication-database参数,必须指向user_db。手动验证用户是否存在
你可以进入MongoDB容器,手动确认用户是否在user_db里:docker exec -it <你的mongodb容器名> mongosh然后执行命令:
use user_db db.getUsers()如果输出里没有
user这个用户,说明创建过程有问题,要么是脚本没执行,要么是创建到了其他库,需要重新调整初始化逻辑。检查初始化脚本的执行日志
查看MongoDB容器的启动日志,搜索“initdb”相关的内容,确认你的初始化脚本是否被正确执行了。如果日志里有“Successfully executed custom script”的提示,说明脚本跑了,那大概率是脚本里的数据库切换错了;如果没找到相关日志,可能是挂载路径不对,或者脚本文件名不是.js后缀(MongoDB只执行docker-entrypoint-initdb.d下的.sh或.js文件)。
内容的提问来源于stack exchange,提问作者Ayush Choudhary

