升级到Spring和Spring Security 5.2.0后出现Mongo身份验证错误

升级到Spring和Spring Security 5.2.0后出现Mongo身份验证错误,spring,mongodb,authentication,spring-security,spring-data-mongodb,Spring,Mongodb,Authentication,Spring Security,Spring Data Mongodb,我正在升级到Spring5.2.0.RELEASE、SpringMongo2.2.0.RELEASE和MongoJava驱动程序3.11.1 在将Spring Security升级到5.2.0之后,我也遇到了以下身份验证错误 如果我回到SpringSecurity4.2,我不会得到这个错误(但有其他问题) 另外,以前我使用的是Spring4.2,没有任何身份验证问题 有什么想法吗 Caused by: com.mongodb.MongoSecurityException: Exception a

我正在升级到Spring5.2.0.RELEASE、SpringMongo2.2.0.RELEASE和MongoJava驱动程序3.11.1

在将Spring Security升级到5.2.0之后,我也遇到了以下身份验证错误

如果我回到SpringSecurity4.2,我不会得到这个错误(但有其他问题)

另外,以前我使用的是Spring4.2,没有任何身份验证问题

有什么想法吗

Caused by: com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=SCRAM-SHA-1, userName='XXX', source='XXX', password=<hidden>, mechanismProperties=<hidden>}
    at com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:173)
    at com.mongodb.internal.connection.SaslAuthenticator.access$300(SaslAuthenticator.java:40)
    at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:70)
    at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:47)
    at com.mongodb.internal.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:179)
    at com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:47)
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:156)
    at com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63)
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:129)
    at com.mongodb.internal.connection.UsageTrackingInternalConnection.open(UsageTrackingInternalConnection.java:50)
    at com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.open(DefaultConnectionPool.java:398)
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:115)
    at com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:101)
    at com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:92)
    at com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:126)
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:728)
    at com.mongodb.operation.FindOperation$1.call(FindOperation.java:725)
    at com.mongodb.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:463)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:725)
    at com.mongodb.operation.FindOperation.execute(FindOperation.java:89)
    at com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:189)
    at com.mongodb.client.internal.FindIterableImpl.first(FindIterableImpl.java:205)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2945)
    at org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2916)
    at org.springframework.data.mongodb.core.MongoTemplate.executeFindOneInternal(MongoTemplate.java:2757)
    ... 81 more
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:175)
    at com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:303)
    at com.mongodb.internal.connection.InternalStreamConnection.sendAndReceive(InternalStreamConnection.java:259)
    at com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
    at com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
    at com.mongodb.internal.connection.SaslAuthenticator.sendSaslContinue(SaslAuthenticator.java:134)
    at com.mongodb.internal.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:40)
    at com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:67)
原因:com.mongodb.MongoSecurityException:验证MongoCredential的异常{mechanism=SCRAM-SHA-1,userName='XXX',source='XXX',password=,mechanismProperties=}
位于com.mongodb.internal.connection.SaslAuthenticator.wrapException(SaslAuthenticator.java:173)
访问com.mongodb.internal.connection.SaslAuthenticator.access$300(SaslAuthenticator.java:40)
位于com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:70)
位于com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:47)
位于com.mongodb.internal.connection.SaslAuthenticator.doAssObject(SaslAuthenticator.java:179)
位于com.mongodb.internal.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:47)
位于com.mongodb.internal.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:156)
位于com.mongodb.internal.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:63)
位于com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:129)
在com.mongodb.internal.connection.UsageTrackingInternalConnection.open上(UsageTrackingInternalConnection.java:50)
位于com.mongodb.internal.connection.DefaultConnectionPool$PooledConnection.open(DefaultConnectionPool.java:398)
位于com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:115)
位于com.mongodb.internal.connection.DefaultConnectionPool.get(DefaultConnectionPool.java:101)
在com.mongodb.internal.connection.DefaultServer.getConnection(DefaultServer.java:92)上
在com.mongodb.binding.ClusterBinding$ClusterBindingConnectionSource.getConnection(ClusterBinding.java:126)上
位于com.mongodb.operation.findoOperation$1.call(findoOperation.java:728)
位于com.mongodb.operation.findoOperation$1.call(findoOperation.java:725)
位于com.mongodb.operation.OperationHelper.withReadConnectionSource(OperationHelper.java:463)
位于com.mongodb.operation.findoOperation.execute(findoOperation.java:725)
位于com.mongodb.operation.findoOperation.execute(findoOperation.java:89)
位于com.mongodb.client.internal.MongoClientDelegate$DelegateOperationExecutor.execute(MongoClientDelegate.java:189)
位于com.mongodb.client.internal.FindIterableImpl.first(FindIterableImpl.java:205)
位于org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2945)
位于org.springframework.data.mongodb.core.MongoTemplate$FindOneCallback.doInCollection(MongoTemplate.java:2916)
位于org.springframework.data.mongodb.core.MongoTemplate.executefinoneinternal(MongoTemplate.java:2757)
... 81多
原因:com.mongodb.MongoCommandException:命令失败,错误为18(AuthenticationFailed):“身份验证失败”。服务器本地主机:27017。完整响应为{“ok”:0.0,“errmsg”:“身份验证失败”,“code”:18,“codeName”:“AuthenticationFailed”}
位于com.mongodb.internal.connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:175)
位于com.mongodb.internal.connection.InternalStreamConnection.receiveCommandMessageResponse(InternalStreamConnection.java:303)
位于com.mongodb.internal.connection.InternalStreamConnection.sendandereceive(InternalStreamConnection.java:259)
位于com.mongodb.internal.connection.CommandHelper.sendAndReceive(CommandHelper.java:83)
位于com.mongodb.internal.connection.CommandHelper.executeCommand(CommandHelper.java:33)
在com.mongodb.internal.connection.SaslAuthenticator.sendsalslcontinue(SaslAuthenticator.java:134)
访问com.mongodb.internal.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:40)
位于com.mongodb.internal.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:67)
以下是我的appContext-Persistence.xml:

<mongo:mongo-client host="${mongo.host}" port="${mongo.port}" id="mongoClient" replica-set="${mongo.replica.set}"
                    credentials="${mongo.username}:${mongo.password}@${mongo.dbname}">
                <mongo:client-options connections-per-host="${mongo.connections.per.host}"
                    threads-allowed-to-block-for-connection-multiplier="4"
                    connect-timeout="${mongo.connection.timeout}" max-wait-time="${mongo.max.wait.time}"
                    socket-keep-alive="true" socket-timeout="1500" />
</mongo:mongo-client>

<mongo:db-factory dbname="${mongo.dbname}" mongo-ref="mongoClient" id="mongoDbFactory" />

<bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
    <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/>
</bean>

<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor"/>


查看以下答案:谢谢。那不管用。现在我自己面对这个问题,你找到解决办法了吗@是的。我有一个现有的类mongocredentials,它对mongo用户名和密码进行了加密。然后我将它们传递给mongo客户端,如下所示: