2017-08-27 4 views
2

一つは、認証が最近有効にされたのMongoDBと対話するためのコアとしてMongoClientを使用します。しかし、多くの場所でアプリがデータを照会するmongoTemplateを使用していますMongoClientとMongoTemplateを使用し、UserCredentials

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

:このmongoClientのように初期化しています。 MongoTemplateが次のように作成された場合:

new MongoTemplate(mongoClient, dbName); 

認証に失敗します。

唯一の方法は、私たちのようにUserCredentialsを渡す場合は

によってUserCredentialsクラスを使用して経由でMongoTemplateにユーザーの資格情報を渡すようだ:

になり
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'. 

それ2つの異なるAPIが並行して存在するようです。両方が一緒に暮らすことができるように、何が最善の方法です。

このアプリは '1.10.6.RELEASE' としてmongodataバージョンを使用しています

+0

質問に「2つの異なるAPI」が表示されません。 2つのAPIとは何ですか? –

+0

私はMongoClientでUserCredentialsを使用することができないとは言いません。 – 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

私は知っています。それが非難されていないことを意味しません。認識する最善の方法は、非推奨警告を有効にしてこのコードを実行することです。私はそれを営業に任せます。 –

0

この場合は、mongodサーバー側でユーザー認証を適用する問題であるようです。

必要な認証はMongoのに適用し、その時点でのデータベースが存在しないが1に結果

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

コマンドによって検証されました。その後、ダミーレコードを挿入してデータベースを作成し、権限を割り当てました。

アプリケーションはすべて一緒にこの問題が到着した場所の設定が正しく適用されていなかったように見える対象のユニットテストケースごとに異なるDBを使用しています。一度修正

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

が正常に動作するように適用しました。しかし同時に、mongoドライバのエラーはあまり説明がなく、少し時間がかかり、デバッグに時間が掛かります。

関連する問題