Подтвердить что ты не робот

Как использовать Spring для подключения к MongoDB, для которого требуется аутентификация

Я использую конфигурацию ниже Spring для подключения к mongoDB

<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo"/>
        <constructor-arg name="databaseName" value="${mongodb.dbname}"/>
    </bean>


    <bean class="com.mongodb.MongoURI" id="mongoUri">
        <constructor-arg value="${mongodb.url}"  />
    </bean>

    <bean class="com.mongodb.Mongo" id="mongo">
        <constructor-arg ref="mongoUri" />
    </bean>

где mongo.url=mongodb://<user>:<password>@<host>:27017

Тем не менее, я получаю ошибку об авторе. Я понимаю, что MongoUI может использовать URL в вышеуказанном формате.

Я знаю, что mongoTemplate может принимать объект userCredentials, но мне нужно будет сначала извлечь их из URL-адреса, и я не уверен, как это сделать в конфигурации.

Любая идея, как я могу изменить свой конфигурационный файл выше, чтобы принять это предположение, что формат mongo.url не может быть изменен?

4b9b3361

Ответ 1

нашел решение, используя Spring Язык выражения

<bean id="mongoTemplate" class="org.springframework.data.document.mongodb.MongoTemplate">
        <constructor-arg name="mongo" ref="mongo"/>
        <constructor-arg name="databaseName" value="${mongodb.dbname}"/>
        <constructor-arg name="userCredentials" ref="mongoCredentials"/>
    </bean>

    <bean id="mongoCredentials" class="org.springframework.data.authentication.UserCredentials">
        <property name="username" value="#{mongoURI.username}" />
        <property name="password" value="#{new java.lang.String(mongoURI.password)}" />
    </bean>

    <bean class="com.mongodb.MongoURI" id="mongoURI">
        <constructor-arg value="${mongodb.url}"  />
    </bean>

    <bean class="com.mongodb.Mongo" id="mongo">
        <constructor-arg ref="mongoURI" />
    </bean>

Ответ 2

Если вы хотите добавить authntication с помощью java config

@Configuration
@EnableMongoRepositories("path.to.your.repository")
public class MongoConfig extends AbstractMongoConfiguration
{
@Value("${mongodb.name}")
private String  dbName;

@Value("${mongodb.host}")
private String  host;

@Value("${mongodb.port}")
private Integer port;

@Value("${mongodb.username}")
private String  userName;

@Value("${mongodb.password}")
private String  password;


@Override
protected String getDatabaseName()
{
    return this.dbName;
}

@Override
public Mongo mongo() throws Exception
{
    return new MongoClient(this.host, this.port);
}

@Override
@Bean
public SimpleMongoDbFactory mongoDbFactory() throws Exception
{
    return new SimpleMongoDbFactory(mongo(), getDatabaseName());
}

@Override
@Bean
public MongoTemplate mongoTemplate() throws Exception
{
    final UserCredentials userCredentials = new UserCredentials(this.userName, this.password);

    final MongoTemplate mongoTemplate = new MongoTemplate(mongo(), getDatabaseName(), userCredentials);
    mongoTemplate.setWriteConcern(WriteConcern.SAFE);

    return mongoTemplate;
}

}

Ответ 3

Чтобы обновить ответ @Lealem Admassu для java config, в Mongo 3 они изменили API, и теперь рекомендуется использовать mongo MongoCredentials вместо UserCredentials.

Вот простой пример того, как получить MongoClient: http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-3.authentication

Следующий код можно сделать модульным, но более или менее это работает для меня (мне нужен MongoTemplate):

public MongoTemplate getMongoTemplate(String host, int port,
                                      String authenticationDB,
                                      String database,
                                      String user, char[] password)
        throws UnknownHostException {
    return new MongoTemplate(
            new SimpleMongoDbFactory(
                    new MongoClient(
                            new ServerAddress(host, port),
                            Collections.singletonList(
                                    MongoCredential.createCredential(
                                            user,
                                            authenticationDB,
                                            password
                                    )
                            )
                    ),
                    database
            )
    );
}