2015-05-26 2 views
3

В настоящее время я пытаюсь подключиться к набору реплик MongoDB с использованием (относительно) нового 3.0 Java-драйвера. Однако, похоже, я не могу поймать MongoSecurityExceptions, которые возникают, когда пользователь предоставляет плохие учетные данные. Это мой текущий код.Проверка подлинности MongoDB с драйвером Java 3.0

try { 
    MongoClientURI mongoClientURI = new MongoClientURI("mongodb://<user>:<password>@member1.com:27017/?authSource=db" 
    this.mongoClient = new MongoClient(mongoClientURI); 
} 
catch(Exception e) { 
    // TODO: some proper exception handling 
    System.err.println(e.toLocalizedMessage()); 
} 

Этот код прекрасно работает при запуске с правильными учетными данными, но исключение вне примерки улова, когда предоставляются плохие учетные данные.

com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='<user>', source='<source>', password=<hidden>, mechanismProperties={}} 
at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:61) 
at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32) 
at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:99) 
at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:44) 
at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:115) 
at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:127) 
at java.lang.Thread.run(Thread.java:745) 

Любая идея, где обращаться с исключениями аутентификации?

ответ

5

Конструкторы MongoClient не генерируют никаких связанных с подключением исключений. Скорее, они возвращаются сразу после запуска одного или нескольких фоновых потоков, которые пытаются установить соединение и аутентифицироваться на основе предоставленных учетных данных.

Только когда приложение использует MongoClient для выполнения некоторой операции на сервере MongoDB, будет выведено исключение. Однако это исключение представляет собой общее исключение тайм-аута, указывающее, что драйвер не смог найти подходящий сервер для операции до истечения срока действия server selection timeout. Например:

MongoClient client = new MongoClient(asList(new ServerAddress("localhost"), new ServerAddress("localhost:27018")), 
             singletonList(MongoCredential.createCredential("username", 
                         "admin", 
                         "bad".toCharArray())), 
             MongoClientOptions.builder().serverSelectionTimeout(1000).build()); 


    try { 
     client.getDB("admin").command("ping"); 
    } catch (MongoTimeoutException e) { 
     // do something 
    } 

будет выдавать исключение MongoTimeoutException через 1 секунду. В то время как исключение MongoSecurityException не выбрасывается, сообщение об ошибке MongoTimeoutException будет содержать соответствующие данные. Например, при подключении к набору реплик три члена, когда один из серверов вниз, и аутентификация не удалось на оставшиеся два, поле сообщение о MongoTimeoutException будет что-то вроде:

тайм-аут после 1000 мс в то время как ожидая сервера, который соответствует ReadPreferenceServerSelector {readPreference = primary}. Вид клиента для Состояние кластера: {type = UNKNOWN, servers = [{address = localhost: 27017, type = UNKNOWN, state = CONNECTING, exception = {com.mongodb.MongoSocketOpenException: открытие исключения socket}, вызванное { java.net.ConnectException: Соединение отклонено}}, {address = localhost: 27018, type = UNKNOWN, state = CONNECTING, exception = {com.mongodb.MongoSecurityException: Исключение аутентификация MongoCredential {mechan = null, userName = 'username ', source =' admin ', password =, механизмProperties = {}}}, вызванный {com.mongodb.MongoCommandException: сбой команды с ошибкой 18: «Ошибка аутентификации». на сервере localhost: 27018. Полный ответ : {«ok»: 0.0, «code»: 18, «errmsg»: «Ошибка аутентификации». }}}]

Смежные вопросы