私は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")を使用するには、いくつかの助けが必要です。
前もって感謝します
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
プロパティからデータベース名を削除する必要があると思います。
また、これを見てください:
この行は、アプリケーションデータベースの設定という点で興味深いはずです。
spring.data.mongodb.database=test # Database name.