web-dev-qa-db-ja.com

複数のmongodbホストに接続し、SpringBootで別のデータベースを使用して認証します

私はmongodbと統合するJavaアプリケーションを持っています。たまたま3つのmongodbホスト(すべて同じポートを持つ)があり、それらは私のアプリケーションのdb以外の別のdbを使用して認証する必要があります例:「admin」は認証データベース名、「contenttest」はアプリケーションが接続したいデータベースです。資格情報(ユーザー名とパスワード)も持っています。次のuriを接続しようとしましたが、機能しません。春のブートアプリケーションで。

application.properties

spring.data.mongodb.authentication-database=admin
spring.data.mongodb.uri = mongodb://content_rw:<secret password>@a.mongo.db:27017,b.mongo.db:27017,c.mongo.db:27017/contenttest?wtimeoutMS=300&connectTimeoutMS=500&socketTimeoutMS=200

次のエラーログで認証に失敗したというエラーが表示されます。

com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='content_rw', source='contenttest', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapInMongoSecurityException(SaslAuthenticator.Java:157) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.Java:37) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.Java:66) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.Java:44) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.Java:162) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.Java:44) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.Java:32) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.Java:109) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.Java:46) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.Java:116) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.Java:113) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at Java.lang.Thread.run(Thread.Java:748) [na:1.8.0_151]
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server a.mongo.db:27017. The full response is { "ok" : 0.0, "code" : 18, "errmsg" : "Authentication failed." }
    at com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.Java:170) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.Java:123) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.Java:32) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.Java:117) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator.access$000(SaslAuthenticator.Java:37) ~[mongodb-driver-core-3.4.3.jar!/:na]
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.Java:50) ~[mongodb-driver-core-3.4.3.jar!/:na]
    ... 9 common frames omitted

stacktraceには、他のホストについても同様の例外が含まれています。

別のデータベース( "admin")を使用して認証を実現し、3つのmongoホストを使用するときに別のデータベース( "contenttest")を使用するには、いくつかの助けが必要です。

前もって感謝します

4
stallion

documentation によると、接続文字列のURI形式は次のとおりです。

mongodb://[username:password@]Host1[:port1][,Host2[:port2],...[,hostN[:portN]]][/[database][?options]]

/databaseの部分は次のように記述されます。

オプション。接続文字列にusername:password @の形式の認証資格情報が含まれている場合に認証するデータベースの名前。/databaseが指定されておらず、接続文字列に資格情報が含まれている場合、ドライバーは管理データベースに対して認証されます。

次のようにURIを設定しました。

spring.data.mongodb.uri = mongodb://content_rw:<secret password>@a.mongo.db:27017,b.mongo.db:27017,c.mongo.db:27017/contenttest?wtimeoutMS=300&connectTimeoutMS=500&socketTimeoutMS=200

ログには、次の行が表示されます。

Exception authenticating MongoCredential{mechanism=null, userName='content_rw', source='contenttest', password=<hidden>, mechanismProperties={}}

MongoCredential.Javaでは、sourceは次のように記述されます。

ユーザー名のソース、通常はユーザーが定義されているデータベースの名前

したがって、認証データベースを次のようにではなく、/contenttestとして設定したようです。

spring.data.mongodb.authentication-database=admin

adminデータベースがデフォルトで使用されるため、URIとおそらくspring.data.mongodb.authentication-databaseプロパティからデータベース名を削除する必要があると思います。

また、これを見てください:

enter image description here

この行は、アプリケーションデータベースの設定という点で興味深いはずです。

spring.data.mongodb.database=test # Database name.
10
cbartosiak