java - 如何捕获 MongoSecurityException?

标签 java mongodb exception mongo-java-driver

我正在尝试验证此处特定用户的登录详细信息。

这根本行不通。我不知道为什么,即使有 MongoSecurityException,它也永远不会到达 catch block 。有人知道为什么吗?

try{
            MongoCredential credential = MongoCredential.createCredential("user", "admin",
                    "password".toCharArray());

            ServerAddress address = new ServerAddress("localhost", 27017);
            mongoClient = new MongoClient(address, Arrays.asList(credential));
            }catch (MongoSecurityException e) {
                e.printStackTrace();
            }

更新:

堆栈跟踪:

May 24, 2017 1:01:08 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Cluster created with settings {hosts=[localhost:27017], mode=SINGLE, requiredClusterType=UNKNOWN, serverSelectionTimeout='30000 ms', maxWaitQueueSize=500}
May 24, 2017 1:01:08 AM com.mongodb.diagnostics.logging.JULLogger log
INFO: Exception in monitor thread while connecting to server localhost:27017
com.mongodb.MongoSecurityException: Exception authenticating MongoCredential{mechanism=null, userName='test', source='admin', password=<hidden>, mechanismProperties={}}
    at com.mongodb.connection.SaslAuthenticator.wrapInMongoSecurityException(SaslAuthenticator.java:157)
    at com.mongodb.connection.SaslAuthenticator.access$200(SaslAuthenticator.java:37)
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:66)
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:44)
    at com.mongodb.connection.SaslAuthenticator.doAsSubject(SaslAuthenticator.java:162)
    at com.mongodb.connection.SaslAuthenticator.authenticate(SaslAuthenticator.java:44)
    at com.mongodb.connection.DefaultAuthenticator.authenticate(DefaultAuthenticator.java:32)
    at com.mongodb.connection.InternalStreamConnectionInitializer.authenticateAll(InternalStreamConnectionInitializer.java:109)
    at com.mongodb.connection.InternalStreamConnectionInitializer.initialize(InternalStreamConnectionInitializer.java:46)
    at com.mongodb.connection.InternalStreamConnection.open(InternalStreamConnection.java:116)
    at com.mongodb.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:113)
    at java.lang.Thread.run(Thread.java:745)
Caused by: com.mongodb.MongoCommandException: Command failed with error 18: 'Authentication failed.' on server localhost:27017. The full response is { "ok" : 0.0, "errmsg" : "Authentication failed.", "code" : 18, "codeName" : "AuthenticationFailed" }
    at com.mongodb.connection.CommandHelper.createCommandFailureException(CommandHelper.java:170)
    at com.mongodb.connection.CommandHelper.receiveCommandResult(CommandHelper.java:123)
    at com.mongodb.connection.CommandHelper.executeCommand(CommandHelper.java:32)
    at com.mongodb.connection.SaslAuthenticator.sendSaslStart(SaslAuthenticator.java:117)
    at com.mongodb.connection.SaslAuthenticator.access$000(SaslAuthenticator.java:37)
    at com.mongodb.connection.SaslAuthenticator$1.run(SaslAuthenticator.java:50)
    ... 9 more

最佳答案

您无法捕获 MongoSecurityException,因为它是在后台线程中抛出的。

您可以等待 MongoTimeoutException 来“同步”处理:

  MongoClientOptions clientOptions = new MongoClientOptions.Builder().serverSelectionTimeout(500).build();
    mongoClient = new MongoClient(serverAddress, Collections.singletonList(credential), clientOptions);
    try {
        String address = mongoClient.getConnectPoint();
        System.out.println(address);
    }catch (Throwable e){
        System.out.println(e);
    }

或者您可以实现 ServerListener 并异步处理

{ 
MongoClientOptions clientOptions = new MongoClientOptions.Builder().addServerListener(this).build();
mongoClient = new MongoClient(host1, Collections.singletonList(credential), clientOptions);
}

@Override
public void serverDescriptionChanged(ServerDescriptionChangedEvent event) {
    Throwable exception = event.getNewDescription().getException();
    handle(exception);
}

关于java - 如何捕获 MongoSecurityException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44145425/

相关文章:

java - Java中使用变量调用构造函数而不引用显式类类型?

java - Wildfly 无法部署应用程序(FileNotFoundException - 访问被拒绝)

java - Idea中读取属性文件出现空指针异常

winforms - 防止出现未处理异常的 "[YourProgramName] has stopped working"对话框

java - Web 应用程序托管网页和查询网页的逻辑应使用哪些技术

java - Java 中的字符串文字

MongoDB按二级查找表排序

javascript - MongoDB - 相当于 LEFT JOIN,其中一个集合不存在

node.js - Express.js - 在 MongoDB 中找不到记录时显示自定义 404 页面

hibernate - 通过 hibernate 删除时出现 StaleStateException