Spring数据MongoDB XML配置无法针对Mongo数据库进行身份验证

Spring数据MongoDB XML配置无法针对Mongo数据库进行身份验证,spring,mongodb,spring-boot,spring-data-mongodb,Spring,Mongodb,Spring Boot,Spring Data Mongodb,目前,我在使用MongoDB进行Spring身份验证时面临一个问题。我的Spring XML配置文件中有以下声明: Spring启动导入Spring XML文件: 我正在“spring引导主类”中导入以下“spring配置XML”文件,如下所示: @SpringBootApplication @ImportResource("classpath:META-INF/spring/Myapp-AppContext.xml") public class MySpringBootApplication

目前,我在使用MongoDB进行Spring身份验证时面临一个问题。我的Spring XML配置文件中有以下声明:

Spring启动导入Spring XML文件: 我正在“spring引导主类”中导入以下“spring配置XML”文件,如下所示:

@SpringBootApplication
@ImportResource("classpath:META-INF/spring/Myapp-AppContext.xml")
public class MySpringBootApplication extends SpringBootServletInitializer {
.... //Some Code goes here
}
Spring配置XML文件:

<mongo:mongo-client id="mongo" host="localhost" port="27017" credentials="admin:mypass@mydb">       
    <mongo:client-options description="Connection to DB"/>
</mongo:mongo-client>

<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>
<mongo:template id="myOps" db-factory-ref="myConnection"/>
<mongo:repositories
    base-package="com.test.app" mongo-template-ref="myOps" />

将其作为“Spring Boot应用程序”运行时,我遇到以下错误:

<mongo:mongo-client id="mongo" host="localhost" port="27017" credentials="admin:mypass@mydb">       
    <mongo:client-options description="Connection to DB"/>
</mongo:mongo-client>

<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>
<mongo:template id="myOps" db-factory-ref="myConnection"/>
<mongo:repositories
    base-package="com.test.app" mongo-template-ref="myOps" />
例外情况:

<mongo:mongo-client id="mongo" host="localhost" port="27017" credentials="admin:mypass@mydb">       
    <mongo:client-options description="Connection to DB"/>
</mongo:mongo-client>

<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>
<mongo:template id="myOps" db-factory-ref="myConnection"/>
<mongo:repositories
    base-package="com.test.app" mongo-template-ref="myOps" />
原因:org.springframework.beans.ConversionNotSupportedException:无法将类型为“java.lang.String”的属性值转换为属性“凭据”所需的类型“com.mongodb.MongoCredential[]”;嵌套异常为java.lang.IllegalStateException:无法将“java.lang.String”类型的值转换为属性“credentials[0]”所需的类型“com.mongodb.MongoCredential”:未找到匹配的编辑器或转换策略 在org.springframework.beans.AbstractNestablePropertyAccessor.ConvertifEssential(AbstractNestablePropertyAccessor.java:590)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.AbstractNestablePropertyAccessor.convertForProperty(AbstractNestablePropertyAccessor.java:604)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.BeanWrapperImpl.convertForProperty(BeanWrapperImpl.java:219)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.convertForProperty(AbstractAutowireCapableBeanFactory.java:1658)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyPropertyValues(AbstractAutowireCapableBeanFactory.java:1614)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1361)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:578)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] ... 省略118个公共帧

异常原因:

根据我的理解,我认为“Spring data Mongodb”JAR缺少一个“Converter”实现,该实现将“credentials”属性(它是字符串类型)转换为“com.Mongodb.MongoCredential”数组

请让我知道是否有另一个企业版的“spring data mongodb”支持身份验证机制或任何其他解决此问题的方法

我的应用程序使用以下版本的软件:

  • 使用的Spring引导版本:2.0.2.0版本
  • 使用的弹簧版本:5.0.6.0版本
  • Spring data MongoDB版本:2.0.9.0发布
  • Mongo驱动程序版本:3.8.0
  • Mongo Java驱动程序版本:3.8.0
  • Mongo驱动程序核心版本:3.8.0(与Mongo Java驱动程序JAR交替使用,因为它们是相同的)
  • Mongo社区服务器版本:3.6.5

我让它以不同的方式工作。这里是最终的Spring XML文件配置,如下所示:

<bean id="myMongoServers" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="myMongoServer" />
    </list>
</constructor-arg>
</bean>

<bean id="myMongoServer" class="com.mongodb.ServerAddress">
        <constructor-arg type="java.lang.String" name="host" value="localhost" />
        <constructor-arg type="int" name="port" value="27017" />
</bean>

<bean id="myMongoCredentials" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="myMongoCredential" />
    </list>
</constructor-arg>
</bean>

<bean id="myMongoCredential" class="com.mongodb.MongoCredential">
        <constructor-arg name="mechanism" value = "#{T(com.mongodb.AuthenticationMechanism).SCRAM_SHA_1}" />
        <constructor-arg type="java.lang.String" name="userName" value="admin" />
        <constructor-arg type="java.lang.String" name="source" value="mydb" />
        <constructor-arg type="char[]" name="password" value="mypass"/>
</bean>

<!-- MongoClient -->
<bean id="mongo" class="com.mongodb.MongoClient">
        <constructor-arg ref="myMongoServers" />
        <constructor-arg ref="myMongoCredentials"  />
</bean>

<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>

<mongo:template id="myOps" db-factory-ref="myConnection"/>

<mongo:repositories base-package="com.test.app" mongo-template-ref="myOps" />

我让它以不同的方式工作。这里是最终的Spring XML文件配置,如下所示:

<bean id="myMongoServers" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="myMongoServer" />
    </list>
</constructor-arg>
</bean>

<bean id="myMongoServer" class="com.mongodb.ServerAddress">
        <constructor-arg type="java.lang.String" name="host" value="localhost" />
        <constructor-arg type="int" name="port" value="27017" />
</bean>

<bean id="myMongoCredentials" class="java.util.ArrayList">
<constructor-arg>
    <list>
        <ref bean="myMongoCredential" />
    </list>
</constructor-arg>
</bean>

<bean id="myMongoCredential" class="com.mongodb.MongoCredential">
        <constructor-arg name="mechanism" value = "#{T(com.mongodb.AuthenticationMechanism).SCRAM_SHA_1}" />
        <constructor-arg type="java.lang.String" name="userName" value="admin" />
        <constructor-arg type="java.lang.String" name="source" value="mydb" />
        <constructor-arg type="char[]" name="password" value="mypass"/>
</bean>

<!-- MongoClient -->
<bean id="mongo" class="com.mongodb.MongoClient">
        <constructor-arg ref="myMongoServers" />
        <constructor-arg ref="myMongoCredentials"  />
</bean>

<mongo:db-factory id="myConnection" mongo-ref="mongo" dbname="mydb"/>

<mongo:template id="myOps" db-factory-ref="myConnection"/>

<mongo:repositories base-package="com.test.app" mongo-template-ref="myOps" />

此问题是由于将凭据传递给mongo驱动程序的方式发生了更改。 这样,您需要提供ServerAddress和凭据(其中的一部分是密码,它被视为字符[])

SCRAM-SHA-1是用于向MongoDB进行身份验证的机制。如果需要,可以使用其他方法使用类似的参数进行不同的身份验证

如果您使用的是基于Java的配置,则可以参考以下代码段:

    @Bean
    public MongoDbFactory mongoDbFactory() {
        ServerAddress serverAddress = new ServerAddress(mongoHost, mongoPort);
        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(mongoUser, mongoDB, mongoPass.toCharArray());

        MongoClient mongoClient = new MongoClient(serverAddress, mongoCredential,
                new MongoClientOptions.Builder().build());
        MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, mongoDB);
        return dbFactory;
    }

    @Bean
    public MongoTemplate mongoTemplate(@Autowired MongoDbFactory mongoDbFactory) {
        return new MongoTemplate(mongoDbFactory);
    }

请参阅:

此问题是由于将凭据传递给mongo驱动程序的方式发生了更改。 这样,您需要提供ServerAddress和凭据(其中的一部分是密码,它被视为字符[])

SCRAM-SHA-1是用于向MongoDB进行身份验证的机制。如果需要,可以使用其他方法使用类似的参数进行不同的身份验证

如果您使用的是基于Java的配置,则可以参考以下代码段:

    @Bean
    public MongoDbFactory mongoDbFactory() {
        ServerAddress serverAddress = new ServerAddress(mongoHost, mongoPort);
        MongoCredential mongoCredential = MongoCredential.createScramSha1Credential(mongoUser, mongoDB, mongoPass.toCharArray());

        MongoClient mongoClient = new MongoClient(serverAddress, mongoCredential,
                new MongoClientOptions.Builder().build());
        MongoDbFactory dbFactory = new SimpleMongoDbFactory(mongoClient, mongoDB);
        return dbFactory;
    }

    @Bean
    public MongoTemplate mongoTemplate(@Autowired MongoDbFactory mongoDbFactory) {
        return new MongoTemplate(mongoDbFactory);
    }

请参阅:

请粘贴您如何导入spring xml文件的代码我更新了我的“问题部分”,关于我如何将“spring xml”文件导入我的“spring boot主类”。我将此应用程序打包为WAR,并将其部署到Tomcat。因此,我的spring boot类正在扩展“SpringBootServletilizer”类。你能粘贴MySpringBootApplication的代码吗?你能共享一个显示问题的项目来运行吗。SD MongoDB有一个专用的
MongoCredentialPropertyEditor
,负责转换凭据字符串。请粘贴如何导入spring xml文件的代码我更新了我的“问题部分”,介绍了如何将“spring xml”文件导入我的“spring boot主类”。我将此应用程序打包为WAR,并将其部署到Tomcat。因此,我的spring boot类正在扩展“SpringBootServletilizer”类。你能粘贴MySpringBootApplication的代码吗?你能共享一个显示问题的项目来运行吗。SD MongoDB有一个专用的
MongoCredentialPropertyEditor
,负责转换凭证字符串。