13

私はmongoDBに接続するために以下のSpring構成を使用しています

<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形式を変更できないと仮定して、上記の構成を変更してこれをサポートするにはどうすればよいですか?

4

3 に答える 3

22

SpringExpressionLanguageを使用して解決策を見つけました

<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>
于 2012-04-23T14:12:43.443 に答える
14

javaconfigを使用して認証を追加する場合

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

}
于 2014-04-30T15:58:00.750 に答える
6

@LealemAdmassuのjavaconfigに対する回答を更新するために、Mongo 3でAPIが変更されたため、.のMongoCredentials代わりにmongoを使用することをお勧めします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
            )
    );
}
于 2016-07-20T12:27:12.460 に答える