2012-04-20 79 views
10

estoy usando la configuración de la primavera de abajo con el fin de conectarse a MongoDBCómo utilizar primavera para conectarse a MongoDB que requiere autenticación

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

donde mongo.url=mongodb://<user>:<password>@<host>:27017

Sin embargo estoy recibiendo un error authetication. Según tengo entendido, MongoUI puede tomar una URL en el formato anterior.

Sé que mongoTemplate puede aceptar el objeto userCredentials, sin embargo, necesitaría extraerlos primero de la URL y no estoy seguro de cómo hacerlo en la configuración.

¿Alguna idea de cómo puedo cambiar mi configuración anterior para suplir esto suponiendo que el formato mongo.url no se puede cambiar?

+0

Intente cambiar el orden de las entradas de beans –

+0

uhu ???? El orden de los beans en una configuración de Spring no importa, es básico Spring – Joly

Respuesta

20

encontrado la solución usando la expresión de Primavera Idioma

<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> 
+4

es mejor usar '

+0

es solo para MongoDB ejemplo, no para el conjunto de réplicas – janwen

+0

¿Puede explicar '# {mongoURI.nombredeusuario}' y '# {new java.lang.String (mongoURI.contraseña)}' –

12

Si desea agregar authntication usando 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; 
} 

} 
+2

Aún más fácil ahora basta para anular el método 'getUserCredentials()'. y elimine los métodos mongoTemplate y mongoDbFactory. – cristobal

+0

Dos problemas: 1) este código usa API s que ahora están en desuso. 2) el código puede dar como resultado la creación de múltiples objetos MongoClient diferentes debido a la llamada "mongo()" en mongoDbFactory() donde debería verificar si ya se creó el objeto y no crear otro. –

5

Para actualizar la respuesta de @Lealem Admassu para la configuración de Java, en Mongo 3 cambiaron el API, y ahora se recomienda usar mongo's MongoCredentials en lugar de UserCredentials.

Aquí hay un ejemplo sencillo de cómo conseguir un MongoClient: http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-3.authentication

El siguiente código puede hacerse modular, pero más o menos esto funciona para mí (que necesitaba un 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 
      ) 
    ); 
} 
+0

¡Esto ayúdame, gracias hombre! –

Cuestiones relacionadas