从 Spring 引导应用程序连接到本地 docker cointainer 中的 MongoDB 运行 身份验证失败
Authentication failed connecting to MongoDB running in a local docker cointainer from Spring Boot application
我无法从我的 [连接到本地 docker 容器中的 mongodb 实例 运行ning =44=]启动应用程序。当应用程序尝试连接到数据库时,抛出以下错误:
2022-04-03 22:45:57.243 ERROR 14559 --- [nio-5000-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='root', source='admin', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='root', source='admin', password=<hidden>, mechanismProperties=<hidden>}] with root cause
com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost: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.4.0.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:418) ~[mongodb-driver-core-4.4.0.jar:na]
这是 docker-compose mongodb 服务定义:
mongodb:
image: mongo
container_name: mongodb
restart: always
ports:
- "27017:27017"
volumes:
- "mongo_data:/tmp/techbank/mongo"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=Pa$$w0rd
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always # fixes MongoNetworkError when mongodb is not ready when mongo-express starts
ports:
- "8081:8081"
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=root
- ME_CONFIG_MONGODB_ADMINPASSWORD=Pa$$w0rd
- ME_CONFIG_MONGODB_SERVER=mongodb
我可以从 mongo-express 客户端访问数据库,当所有服务都启动并且 运行ning 时。
这些是 spring 数据 mongodb 属性:
spring:
data:
mongodb:
host: localhost
port: 27017
database: bankAccount
username: root
password: Pa$$w0rd
authentication-database: admin
我也试过:
spring:
data:
mongodb:
uri: "mongodb://root:Pa$$w0rd@localhost:27017/bankAccount=true&authSource=admin&authMechanism=SCRAM-SHA-1"
我在 Whosebug 中研究过类似的问题,但没有解决方案。
您可以在此处找到 运行 本地应用程序的说明 techbank-build-github
如果您需要更多详细信息,请在下面留下您的评论。
会不会是网络问题而不是身份验证问题?
Spring 启动应用程序在这里指定了一个“本地主机”,所以我假设它不会 运行 和 docker-compose...
我建议尝试以下方法:
- 尝试连接某种客户端(robomongo,mongod 等等)并确保它完全可以访问
- 尝试通过添加
--bind_ip_all
选项将 mongo 自身绑定到所有接口,正如 official mongo documentation 建议的那样
感谢@Mark Bramnik 的回答,我意识到我无法使用 root:Pa$$w0rd
凭据对 mongodb 容器进行身份验证。
我创建了一个名为 init-mongo.js
:
的文件
db.createUser(
{
user: "storeAdmin",
pwd: "storeAdmin2022",
roles: [
{
role: "readWrite",
db: "bankAccount"
}
]
}
)
在 the docker-compose.yml
中的 services:mongodb:volumes
下添加了 ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo-js:ro
,以便将 init-mongo.js
作为只读文件复制到 /docker-entrypoint-initdb.d/
。
/docker-entrypoint-initdb.d
是已经在 mongodb 容器中创建的文件夹,用于启动数据库。
然后相应地更新 spring 数据 mongodb 属性:
spring:
data:
mongodb:
host: localhost
port: 27017
database: bankAccount
username: storeAdmin
password: storeAdmin2022
现在它就像一个魅力
我无法从我的 [连接到本地 docker 容器中的 mongodb 实例 运行ning =44=]启动应用程序。当应用程序尝试连接到数据库时,抛出以下错误:
2022-04-03 22:45:57.243 ERROR 14559 --- [nio-5000-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='root', source='admin', password=<hidden>, mechanismProperties=<hidden>}; nested exception is com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-256, userName='root', source='admin', password=<hidden>, mechanismProperties=<hidden>}] with root cause
com.mongodb.MongoCommandException: Command failed with error 18 (AuthenticationFailed): 'Authentication failed.' on server localhost: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.4.0.jar:na]
at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:418) ~[mongodb-driver-core-4.4.0.jar:na]
这是 docker-compose mongodb 服务定义:
mongodb:
image: mongo
container_name: mongodb
restart: always
ports:
- "27017:27017"
volumes:
- "mongo_data:/tmp/techbank/mongo"
environment:
- MONGO_INITDB_ROOT_USERNAME=root
- MONGO_INITDB_ROOT_PASSWORD=Pa$$w0rd
mongo-express:
image: mongo-express
container_name: mongo-express
restart: always # fixes MongoNetworkError when mongodb is not ready when mongo-express starts
ports:
- "8081:8081"
environment:
- ME_CONFIG_MONGODB_ADMINUSERNAME=root
- ME_CONFIG_MONGODB_ADMINPASSWORD=Pa$$w0rd
- ME_CONFIG_MONGODB_SERVER=mongodb
我可以从 mongo-express 客户端访问数据库,当所有服务都启动并且 运行ning 时。
这些是 spring 数据 mongodb 属性:
spring:
data:
mongodb:
host: localhost
port: 27017
database: bankAccount
username: root
password: Pa$$w0rd
authentication-database: admin
我也试过:
spring:
data:
mongodb:
uri: "mongodb://root:Pa$$w0rd@localhost:27017/bankAccount=true&authSource=admin&authMechanism=SCRAM-SHA-1"
我在 Whosebug 中研究过类似的问题,但没有解决方案。
您可以在此处找到 运行 本地应用程序的说明 techbank-build-github
如果您需要更多详细信息,请在下面留下您的评论。
会不会是网络问题而不是身份验证问题?
Spring 启动应用程序在这里指定了一个“本地主机”,所以我假设它不会 运行 和 docker-compose...
我建议尝试以下方法:
- 尝试连接某种客户端(robomongo,mongod 等等)并确保它完全可以访问
- 尝试通过添加
--bind_ip_all
选项将 mongo 自身绑定到所有接口,正如 official mongo documentation 建议的那样
感谢@Mark Bramnik 的回答,我意识到我无法使用 root:Pa$$w0rd
凭据对 mongodb 容器进行身份验证。
我创建了一个名为 init-mongo.js
:
db.createUser(
{
user: "storeAdmin",
pwd: "storeAdmin2022",
roles: [
{
role: "readWrite",
db: "bankAccount"
}
]
}
)
在 the docker-compose.yml
中的 services:mongodb:volumes
下添加了 ./init-mongo.js:/docker-entrypoint-initdb.d/init-mongo-js:ro
,以便将 init-mongo.js
作为只读文件复制到 /docker-entrypoint-initdb.d/
。
/docker-entrypoint-initdb.d
是已经在 mongodb 容器中创建的文件夹,用于启动数据库。
然后相应地更新 spring 数据 mongodb 属性:
spring:
data:
mongodb:
host: localhost
port: 27017
database: bankAccount
username: storeAdmin
password: storeAdmin2022
现在它就像一个魅力