Как использовать 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 не может быть изменен?
Ответы
Ответ 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
)
);
}