使用Java 3.0驱动程序检查MongoDB身份验证

3

我目前正在尝试使用(相对)较新的3.0 Java驱动程序连接到MongoDB副本集。但是,当用户提供错误的凭据时,我似乎无法捕获发生的MongoSecurityExceptions异常。这是我的当前代码。

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());
}

当使用正确的凭据运行此代码时,它可以正常工作,但是当提供错误的凭据时,在try-catch之外会抛出异常。

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)

有任何想法在哪里处理身份验证异常吗?

1个回答

6

MongoClient构造函数不会抛出任何连接相关的异常。相反,它们在启动一个或多个后台线程尝试基于提供的凭据建立连接和进行身份验证后立即返回。

只有当应用程序使用MongoClient对MongoDB服务器执行某些操作时,才会抛出异常。然而,该异常是一个通用的超时异常,表示驱动程序在服务器选择超时到期之前未能找到适合该操作的服务器。例如:

    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
    }

1秒后将抛出MongoTimeoutException。虽然不会抛出MongoSecurityException,但是MongoTimeoutException的消息将包含相关细节。例如,当连接到三个成员副本集时,其中一个服务器关闭,并且在其余两个服务器上身份验证失败时,MongoTimeoutException的消息字段将类似于:

等待匹配ReadPreferenceServerSelector {readPreference = primary}的服务器超时1000毫秒。客户端查看群集状态为{type = UNKNOWN,servers = [{address = localhost:27017,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSocketOpenException:打开套接字时发生异常},原因是{java.net.ConnectException:拒绝连接}},{address = localhost:27018,type = UNKNOWN,state = CONNECTING,exception = {com.mongodb.MongoSecurityException:MongoCredential {机制= null,userName ='username',source ='admin',password =,机制属性 = {}}进行身份验证时发生异常},原因是{com.mongodb.MongoCommandException:在localhost:27018的服务器上命令失败,错误代码为18:'Authentication failed.'。完整响应为{"ok":0.0,"code":18,"errmsg":"Authentication failed."}}}]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接