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

时间:2018-08-16 18:32:45

标签: spring mongodb spring-boot spring-data-mongodb

当前,我在使用MongoDB进行Spring身份验证时遇到问题。我的Spring XML配置文件中有以下声明:

Spring Boot导入Spring XML文件: 我在“ spring boot main class”中导入以下“ spring configuration XML”文件,如下所示:

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

Spring Configuration 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应用程序”运行时,出现以下错误:

  

例外:

     

原因:org.springframework.beans.ConversionNotSupportedException:无法将类型“ java.lang.String”的属性值转换为属性“凭据”所需的类型“ com.mongodb.MongoCredential []”;嵌套异常为java.lang.IllegalStateException:无法将属性“ credentials [0]”的类型“ java.lang.String”的值转换为必需的类型“ com.mongodb.MongoCredential”:找不到匹配的编辑器或转换策略       在org.springframework.beans.AbstractNestablePropertyAccessor.convertIfNecessary(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缺少用于转换“凭据”的“转换器”实现 < / strong>属性(它是字符串类型)到“ com.mongodb.MongoCredential”数组

请让我知道是否存在支持身份验证机制的其他企业版本的“ spring-data-mongodb”,或者欢迎使用任何其他解决此问题的方式。

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

  • 使用的Spring Boot版本:2.0.2.RELEASE
  • 使用的春季版本:5.0.6.RELEASE
  • Spring data MongoDB版本:2.0.9.RELEASE
  • Mongo驱动程序版本:3.8.0
  • Mongo Java驱动程序版本:3.8.0
  • Mongo驱动程序核心版本:3.8.0(由于它们相同,可与Mongo Java驱动程序JAR交替使用)
  • Mongo社区服务器版本:3.6.5

2 个答案:

答案 0 :(得分:1)

我使它以不同的方式工作。这是最终的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" />

答案 1 :(得分:0)

此问题是由于凭据传递给mongo-driver的方式发生了更改。 这样,您需要提供ServerAddress和Credentials(其中一部分是用作Character []的密码)。

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);
    }

请参阅:https://www.w3.org/TR/wai-aria-practices/examples/combobox/aria1.1pattern/listbox-combo.html