2017-08-27 164 views
2

其中一個應用程序使用MongoClient作爲與最近啓用了身份驗證的MongoDB進行交互的核心。在這個mongoClient初始化爲:在MongoClient和UserCredentials中使用MongoTemplate

mongoClient = new MongoClient(serverAddress, Arrays.asList(MongoCredential.createCredential(userName, dbName, password.toCharArray()))); 

但是在很多地方,app使用mongoTemplate來查詢數據。現在,如果MongoTemplate創建爲:

new MongoTemplate(mongoClient, dbName); 

它導致身份驗證失敗。

的唯一方法似乎用戶憑據傳遞到MongoTemplate是通過使用UserCredentials類由

但是如果我們通過UserCredentials爲:

public MongoTemplate(Mongo mongo, String databaseName, UserCredentials userCredentials) { 

哪些結果:

Usage of 'UserCredentials' with 'MongoClient' is no longer supported. Please use 'MongoCredential' for 'MongoClient' or just 'Mongo'. 

它好像兩個不同的API並行存在。最好的方式是什麼讓他們倆能夠一起生活。

這個程序使用mongodata版本 '1.10.6.RELEASE'

+0

我在你的問題中沒有看到「兩個不同的API」。什麼是2 API? –

+0

我的意思是說無法使用UserCredentials與MongoClient,其中沒有一個似乎不推薦使用。 – tarunkumar

回答

0

試試這個:

MongoCredential mongoCredential = MongoCredential.createCredential("user", "database","password".toCharArray()); 
ServerAddress address = new ServerAddress("mymongo.mycompany.com", 62797); 
MongoClient mongoClient = new MongoClient(address, Arrays.asList(mongoCredential)); 
MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, "database"); 
+0

在這種情況下,獲取org.springframework.dao.PermissionDeniedDataAccessException:{「serverUsed」:「127.0.0.1:23423」,「ok」:0.0,「errmsg」:「身份驗證失敗。 ,「code」:18,「codeName」:「AuthenticationFailed」};嵌套的異常是com.mongodb.CommandFailureException:{「serverUsed」:「127.0.0.1:23423」,「ok」:0。0,「errmsg」:「驗證失敗。」 ,「code」:18,「codeName」:「AuthenticationFailed」} – tarunkumar

+0

@tarunkumar有'createXXCrendential'的各種重載版本。我使用的默認設置嘗試檢測最佳機制,但它可能無法正常工作。嘗試其他的,特別是'createMongoCRCredential'。通過調試來幫助自己:如果我是你,我會寫一個簡單的Java客戶端並嘗試連接到Mongo實例;您的問題不再是棄用警告或'MongoTemplate'配置,並且不知道服務器的詳細信息,我無法向您提供分步說明。 –

0

試試這個配置:

@Configuration 
public class MongoConfiguration { 

    @Bean 
    public MongoDbFactory mongoDbFactory() throws Exception { 
     UserCredentials userCredentials = new UserCredentials("YOUR_USER_NAME", "YOUR_PASSWORD"); 
     return new SimpleMongoDbFactory(new Mongo(), "YOUR_DATABASE", userCredentials); 
    } 

    @Bean 
    public MongoTemplate mongoTemplate() throws Exception { 
     return new MongoTemplate(mongoDbFactory()); 
    } 
} 

並創建數據庫存儲庫只使用MongoRepository像這樣:

public interface UserRepository extends MongoRepository<User,Serializable>{ 
    User findById(String id); 
} 
+0

我認爲'MongoDbFactory'可能會被棄用。 –

+0

我已經從他們的文檔中引用它。鏈接:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.mongo-db-factory-java –

+0

我知道;並不意味着它不被棄用。知道最好的方法是使用棄用警告啓用此代碼。我會把它留給OP。 –

0

在這種情況下,似乎是在mongod服務器端應用用戶身份驗證的問題。

最少報名認證應用於MONGO和由

db.auth('user','pass'); 

命令這在當時產生1。然而數據庫已經被驗證不存在。之後通過插入虛擬記錄創建數據庫,並分配權限。

應用程序在單元測試用例中使用了所有不同的數據庫,因此在此問題到達時,它看起來像配置未正確應用。

一旦修正應用於

new MongoClient(serverAddress, Arrays.asList(MongoCredential.createCredential(userName, dbName, password.toCharArray()))); 

似乎很好地工作。然而同時,mongo驅動程序錯誤有點含糊不清,導致調試耗時。