【问题标题】:Spring Data MongoDB XML Configuration failed to Authenticate against Mongo-databaseSpring Data MongoDB XML 配置无法针对 Mongo 数据库进行身份验证
【发布时间】:2018-08-16 18:32:44
【问题描述】:

目前,我在使用 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 配置 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:无法将类型“java.lang.String”的值转换为属性“credentials [0]”所需的类型“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 缺少一个 "Converter" 实现,它可以转换 "credentials" 属性(它是一个字符串类型)到 "com.mongodb.MongoCredential" 数组

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

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

  • 使用的 Spring Boot 版本:2.0.2.RELEASE
  • 使用的春季版本:5.0.6.RELEASE
  • Spring 数据 MongoDB 版本:2.0.9.RELEASE
  • Mongo 驱动版本:3.8.0
  • Mongo Java 驱动程序版本:3.8.0
  • Mongo Driver Core 版本:3.8.0(与 Mongo Java Driver JAR 交替使用,因为它们是相同的)
  • Mongo 社区服务器版本:3.6.5

【问题讨论】:

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

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


【解决方案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" />

【讨论】:

    【解决方案2】:

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

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

    如果你使用基于 Java 的配置,你可以参考这个 sn-p:

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

    请参考:http://mongodb.github.io/mongo-java-driver/3.6/javadoc/?com/mongodb/MongoCredential.html

    【讨论】:

      【解决方案3】:

      Spring xml 配置

      <bean   id="mongoServer1" class="com.mongodb.ServerAddress">
          <constructor-arg    type="java.lang.String" name="host" value="190.6.5.167"/>
          <constructor-arg    type="int"  name="port" value="27017"/>
      </bean>
      <bean   id="mongoServer2" class="com.mongodb.ServerAddress">
          <constructor-arg    type="java.lang.String" name="host" value="190.6.5.168"/>
          <constructor-arg    type="int"  name="port" value="27017"/>
      </bean>
      <bean   id="mongoServer3" class="com.mongodb.ServerAddress">
          <constructor-arg    type="java.lang.String" name="host" value="190.6.5.169"/>
          <constructor-arg    type="int"  name="port" value="27017"/>
      </bean>
      <bean   id="mongoServers" class="java.util.ArrayList">
          <constructor-arg>
              <list>
                  <ref    bean="mongoServer1"/>
                  <ref    bean="mongoServer2"/>
                  <ref    bean="mongoServer3"/>
              </list>
          </constructor-arg>
      </bean>
      <bean id="mongoCredential" class="com.mongodb.MongoCredential" factory-method="createCredential"> 
          <constructor-arg    type="java.lang.String" name="userName" value="adminuser"/>
          <constructor-arg    type="java.lang.String" name="database" value="testdb"/>
          <constructor-arg    type="char[]"   name="password" value="adminpass"/>
      </bean>
      <bean id="mongoClientOptions" class="org.demo.helper.mongo.MongoClientOptionBuilderHelper"
          factory-method="createMongoClientOptions">
          <constructor-arg type="int" name="minConnectionsPerHost"    value="60"/>
          <constructor-arg type="int" name="threadsAllowedToBlockForConnectionMultiplier" value="10"/>
          <constructor-arg type="int" name="connectTimeout"   value="60000"/>
          <constructor-arg type="int" name="socketTimeout"    value="60000"/>
          <constructor-arg type="boolean" name="socketKeepAlive"  value="true"/>
      </bean>
      <bean id="mongoClient" class="com.mongodb.MongoClient">
          <constructor-arg    name="seeds"    ref="mongoServers"/>
          <constructor-arg    name="credential"   ref="mongoCredential"/>
          <constructor-arg    name="options"  ref="mongoClientOptions"/>
      </bean>
      

      助手类

      package org.demo.helper.mongo;
      
      import com.mongodb.MongoClientOptions;
      
      public class MongoClientOptionBuilderHelper {
      
          private static MongoClientOptions mongoClientOptions = null;
      
          public static MongoClientOptions createMongoClientOptions(int minConnectionsPerHost,
                  int tatbfcm, int connectTimeout, int socketTimeout,
                  boolean socketKeepAlive) {
              if (mongoClientOptions == null) {
                  synchronized (MongoClientOptionBuilderHapler.class) {
                      if (mongoClientOptions == null) {
                          mongoClientOptions = MongoClientOptions
                          .builder()
                          .minConnectionsPerHost(minConnectionsPerHost)
                          .threadsAllowedToBlockForConnectionMultiplier(tatbfcm) 
                          .connectTimeout(connectTimeout)
                          .socketTimeout(socketTimeout)
                          //...
                          //...
                          //...
                          .socketKeepAlive(socketKeepAlive)
                          .build();
                      }
                  }
              }
              return mongoClientOptions;
          }
      
      }
      

      Mongo Java 驱动版本

      <!-- https://mvnrepository.com/artifact/org.mongodb/mongo-java-driver -->
      <dependency>
          <groupId>org.mongodb</groupId>
          <artifactId>mongo-java-driver</artifactId>
          <version>3.12.0</version>
      </dependency>
      

      Spring 核心版本

      <!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->
      <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-core</artifactId>
          <version>4.2.5.RELEASE</version>
      </dependency>
      

      【讨论】:

        猜你喜欢
        • 2022-01-10
        • 2019-02-12
        • 1970-01-01
        • 2012-06-05
        • 1970-01-01
        • 1970-01-01
        • 2015-06-18
        • 1970-01-01
        • 2011-06-10
        相关资源
        最近更新 更多