Spring Boot连接MongoDB时认证失败问题求助
Spring Boot对接MongoDB自定义数据库认证失败问题解决
我在使用Spring Boot构建REST API并对接MongoDB时,尝试在名为“abc”的自定义数据库中创建集合,遭遇认证异常,提示“Failed to execute CommandLineRunner”,根源为MongoCredential认证失败,完整堆栈跟踪信息如下:
Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled. 2023-06-16T13:42:45.889+05:30 ERROR 12852 --- [ main] o.s.boot.SpringApplication : Application run failed java.lang.IllegalStateException: Failed to execute CommandLineRunner at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:773) ~[spring-boot-3.1.0.jar:3.1.0] at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:754) ~[spring-boot-3.1.0.jar:3.1.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.1.0.jar:3.1.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1305) ~[spring-boot-3.1.0.jar:3.1.0] at org.springframework.boot.SpringApplication.run(SpringApplication.java:1294) ~[spring-boot-3.1.0.jar:3.1.0] at com.example.abc.AbcApplication.main(AbcApplication.java:15) ~[classes/:na] Caused by: org.springframework.data.mongodb.UncategorizedMongoDbException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='abc', password=<hidden>, mechanismProperties=<hidden>} at org.springframework.data.mongodb.core.MongoExceptionTranslator.translateExceptionIfPossible(MongoExceptionTranslator.java:140) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.potentiallyConvertRuntimeException(MongoTemplate.java:2932) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:602) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.insertDocument(MongoTemplate.java:1538) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.doInsert(MongoTemplate.java:1334) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.insert(MongoTemplate.java:1260) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.repository.support.SimpleMongoRepository.insert(SimpleMongoRepository.java:228) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(DirectMethodHandleAccessor.java:104) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:578) ~[na:na] at org.springframework.data.repository.core.support.RepositoryMethodInvoker$RepositoryFragmentMethodInvoker.lambda$new$0(RepositoryMethodInvoker.java:288) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:136) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:120) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.RepositoryComposition$RepositoryFragments.invoke(RepositoryComposition.java:516) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.RepositoryComposition.invoke(RepositoryComposition.java:285) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.RepositoryFactorySupport$ImplementationMethodExecutionInterceptor.invoke(RepositoryFactorySupport.java:628) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:168) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:143) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9] at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:77) ~[spring-data-commons-3.1.0.jar:3.1.0] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9] at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97) ~[spring-aop-6.0.9.jar:6.0.9] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:184) ~[spring-aop-6.0.9.jar:6.0.9] at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:223) ~[spring-aop-6.0.9.jar:6.0.9] at jdk.proxy2/jdk.proxy2.$Proxy83.insert(Unknown Source) ~[na:na] at com.example.abc.AbcApplication.lambda$runner$0(AbcApplication.java:30) ~[classes/:na] at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:770) ~[spring-boot-3.1.0.jar:3.1.0] ... 5 common frames omitted Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='rootuser', source='abc', password=<hidden>, mechanismProperties=<hidden>} at com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:270) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:133) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.lambda$authenticate$0(SaslAuthenticator.java:63) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:277) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:59) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:57) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticate(InternalStreamConnectionInitializer.java:205) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnectionInitializer.finishHandshake(InternalStreamConnectionInitializer.java:85) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:209) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.UsageTrackingInternalConnection.open(UsageTrackingInternalConnection.java:55) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.open(DefaultConnectionPool.java:534) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultConnectionPool$OpenConcurrencyLimiter.openWithConcurrencyLimit(DefaultConnectionPool.java:895) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultConnectionPool$OpenConcurrencyLimiter.openOrGetAvailable(DefaultConnectionPool.java:836) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:177) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:166) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:97) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:173) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.client.internal.ClientSessionBinding$SessionBindingConnectionSource.getConnection(ClientSessionBinding.java:193) ~[mongodb-driver-sync-4.9.1.jar:na] at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:375) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.OperationHelper.lambda$withSourceAndConnection$1(OperationHelper.java:357) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.OperationHelper.withSuppliedResource(OperationHelper.java:383) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.OperationHelper.withSourceAndConnection(OperationHelper.java:356) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.MixedBulkWriteOperation.lambda$execute$1(MixedBulkWriteOperation.java:181) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.async.function.RetryingSyncSupplier.get(RetryingSyncSupplier.java:67) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:202) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.operation.MixedBulkWriteOperation.execute(MixedBulkWriteOperation.java:76) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:206) ~[mongodb-driver-sync-4.9.1.jar:na] at com.mongodb.client.internal.MongoCollectionImpl.executeSingleWriteRequest(MongoCollectionImpl.java:1024) ~[mongodb-driver-sync-4.9.1.jar:na] at com.mongodb.client.internal.MongoCollectionImpl.executeInsertOne(MongoCollectionImpl.java:475) ~[mongodb-driver-sync-4.9.1.jar:na] at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:458) ~[mongodb-driver-sync-4.9.1.jar:na] at com.mongodb.client.internal.MongoCollectionImpl.insertOne(MongoCollectionImpl.java:452) ~[mongodb-driver-sync-4.9.1.jar:na] at org.springframework.data.mongodb.core.MongoTemplate.lambda$insertDocument$16(MongoTemplate.java:1544) ~[spring-data-mongodb-4.1.0.jar:4.1.0] at org.springframework.data.mongodb.core.MongoTemplate.execute(MongoTemplate.java:600) ~[spring-data-mongodb-4.1.0.jar:4.1.0] ... 29 common frames omitted Caused by: 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:205) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:443) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:365) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:102) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:49) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:224) ~[mongodb-driver-core-4.9.1.jar:na] at com.mongodb.internal.connection.SaslAuthenticator.getNextSaslResponse(SaslAuthenticator.java:131) ~[mongodb-driver-core-4.9.1.jar:na] ... 60 common frames omitted Process finished with exit code 1
解决方案
核对认证源配置
堆栈显示当前使用abc数据库作为认证源,但如果你的rootuser是在admin数据库创建的超级用户,必须将认证源改为admin。这是MongoDB的常见配置误区,超级用户默认在admin库下授权。验证账号密码有效性
使用MongoDB Shell直接测试连接,排除账号密码错误:mongosh "mongodb://localhost:27017/abc" -u rootuser -p 你的密码 --authenticationDatabase admin如果能成功连接,说明账号密码没问题,问题出在Spring Boot配置;如果连接失败,检查账号密码或用户是否存在。
修正Spring Boot配置
确保application.properties或application.yml中的MongoDB URI包含正确的认证源:application.properties示例
spring.data.mongodb.uri=mongodb://rootuser:你的密码@localhost:27017/abc?authSource=adminapplication.yml示例
spring: data: mongodb: uri: mongodb://rootuser:你的密码@localhost:27017/abc?authSource=admin确认用户数据库权限
如果确实要在abc数据库认证,需确保rootuser拥有该库的读写权限。登录MongoDB Shell执行:use abc db.grantRolesToUser("rootuser", ["readWrite"])
内容的提问来源于stack exchange,提问作者ROSHEN JAYAKODY
相关产品推荐
相关产品推荐

