복붙노트

[SPRING] Spring을 사용하여 인증이 필요한 MongoDB에 연결하는 방법

SPRING

Spring을 사용하여 인증이 필요한 MongoDB에 연결하는 방법

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 : // : @ : 27017

그러나 인증 오류가 발생합니다. 나의 이해는 MongoUI가 위의 형식으로 URL을 취할 수 있다는 것이다.

mongoTemplate이 userCredentials 객체를 받아 들일 수 있다는 것을 알고 있지만 URL에서 먼저 추출해야하고 구성에서이를 수행하는 방법을 모르겠습니다.

어떤 생각을 어떻게하면 위의 mongo.url 형식을 변경할 수 없다는 가정하에이 설정을 변경할 수 있습니까?

해결법

  1. ==============================

    1.Spring Expression Language를 사용하여 솔루션을 찾았습니다.

    Spring Expression Language를 사용하여 솔루션을 찾았습니다.

    <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. ==============================

    2.java config를 사용하여 인증을 추가하려면

    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. ==============================

    3.@Lealem Admassu의 자바 구성에 대한 대답을 업데이트하기 위해 Mongo 3에서 API를 변경 했으므로 이제는 UserCredentials 대신 Mongo의 MongoCredentials를 사용하는 것이 좋습니다.

    @Lealem Admassu의 자바 구성에 대한 대답을 업데이트하기 위해 Mongo 3에서 API를 변경 했으므로 이제는 UserCredentials 대신 Mongo의 MongoCredentials를 사용하는 것이 좋습니다.

    다음은 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
                )
        );
    }
    
  4. from https://stackoverflow.com/questions/10249816/how-to-use-spring-to-connect-to-mongodb-which-requires-authentication by cc-by-sa and MIT license