2012-04-20 92 views
10

Sto usando la configurazione di Spring qui sotto per connettersi a MongoDBCome utilizzare Spring per connettersi a MongoDB, che richiede l'autenticazione

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

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

Comunque sto ricevendo un errore authetication. La mia comprensione era che MongoUI può prendere un URL nel formato sopra.

So che mongoTemplate può accettare l'oggetto userCredentials ma dovrei prima estrarlo dall'URL e non sono sicuro di come farlo nella configurazione.

Qualche idea su come posso cambiare la mia configurazione qui sopra per supporre che si presuma che il formato mongo.url non possa essere modificato?

+0

Provare a mischiare l'ordine delle voci di bean –

+0

uhu ???? L'ordine dei bean in una configurazione Spring non ha importanza, è semplice Spring – Joly

risposta

20

trovato la soluzione con Primavera 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> 
+4

meglio usare '

+0

è per singolo MongoDB istanza, non per Replica Set – janwen

+0

Puoi spiegare '# {mongoURI.username}' e '# {new java.lang.String (mongoURI.password)}' –

12

Se si desidera aggiungere authntication utilizzando 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

Ancora più facile ora è sufficiente per sovrascrivere il metodo 'getUserCredentials()'. e rimuovere i metodi mongoTemplate e mongoDbFactory. – cristobal

+0

Due numeri: 1) questo codice utilizza API s che ora sono deprecate. 2) il codice può comportare la creazione di più oggetti MongoClient diversi a causa della chiamata "mongo()" in mongoDbFactory() in cui dovrebbe verificare se è già stato creato l'oggetto e non crearne un altro. –

5

Per aggiornare la risposta di @Lealem Admassu per Java di configurazione, in Mongo 3 hanno cambiato la API, e ora si consiglia di utilizzare il mongo MongoCredentials anziché UserCredentials.

Qui c'è un semplice esempio di come ottenere un MongoClient: http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-3.authentication

Il codice successivo può essere fatto modulare, ma più o meno questo funziona per me (avevo bisogno di 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

Questo mi aiuta, grazie amico! –

Problemi correlati