0

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

Spring Boot 导入 Spring XML 文件: 我在我的“spring boot 主类”中导入下面的“spring configuration XML”文件,如下所示:

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

弹簧配置 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] at 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。发布] 在 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个常用帧578)~[spring-beans-5.0.6.RELEASE.jar:5.0.6.RELEASE] ...省略了118个常用框架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
  • 使用的 Spring 版本:5.0.6.RELEASE
  • Spring Data 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
4

3 回答 3

2

我让它以不同的方式工作。在这里,最终的 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" />
于 2018-08-22T17:18:55.007 回答
0

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>

春芯版

<!-- 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-20T13:50:01.703 回答
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);
    }

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

于 2018-09-26T21:29:20.513 回答