2012-04-20 90 views
10

Tôi đang sử dụng cấu hình Spring dưới đây để kết nối với MongoDBLàm thế nào để sử dụng Spring để kết nối với MongoDB mà yêu cầu xác thực

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

nơi mongo.url=mongodb://<user>:<password>@<host>:27017

Tuy nhiên tôi nhận được một lỗi authetication. Sự hiểu biết của tôi là MongoUI có thể lấy URL theo định dạng trên.

Tôi biết rằng mongoTemplate có thể chấp nhận đối tượng userCredentials tuy nhiên tôi sẽ cần trích xuất chúng từ URL trước và tôi không chắc chắn cách thực hiện điều đó trong cấu hình.

Bất kỳ ý tưởng nào làm thế nào tôi có thể thay đổi cấu hình của mình ở trên để hỗ trợ định dạng giả định mongo.url này không thể thay đổi?

+0

Hãy thử xáo trộn thứ tự các mục nhập đậu –

+0

uhu ???? Thứ tự của các bean trong cấu hình Spring không quan trọng, đó là cơ bản Spring – Joly

Trả lời

20

tìm thấy các giải pháp sử dụng 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> 
+4

tốt hơn để sử dụng '

+0

nó chỉ dành cho MongoDB đơn Ví dụ, không cho Replica Set – janwen

+0

Bạn có thể giải thích '# {mongoURI.username}' và '# {new java.lang.String (mongoURI.password)}' –

12

Nếu bạn muốn thêm authntication sử dụng java cấu hình

@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

Thậm chí còn dễ dàng hơn bây giờ đủ để ghi đè phương thức 'getUserCredentials()'. và loại bỏ các phương thức mongoTemplate và mongoDbFactory. – cristobal

+0

Hai vấn đề: 1) mã này sử dụng các API hiện không còn được dùng nữa. 2) mã có thể dẫn đến nhiều đối tượng MongoClient khác nhau được tạo ra do cuộc gọi "mongo()" trong mongoDbFactory(), nơi nó sẽ kiểm tra nếu nó đã tạo đối tượng và không tạo một đối tượng khác. –

5

Để cập nhật câu trả lời @Lealem Admassu cho java cấu hình, trong Mongo 3 họ đã thay đổi API và bây giờ bạn nên sử dụng MongoCredentials của mongo thay vì UserCredentials.

Ở đây có là một ví dụ đơn giản về cách để có được một MongoClient: http://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-3.authentication

Mã tiếp theo có thể được thực hiện mô đun, nhưng nhiều hơn hoặc ít hơn này làm việc cho tôi (Tôi cần một người 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

Điều này giúp tôi, cảm ơn người đàn ông! –

Các vấn đề liên quan