首页 > 解决方案 > 测试与多个 LDAP 服务器的连接时出错

问题描述

我正在开发一个需要连接到 Active Directory 服务器 (LDAP) 以便对某些用户进行身份验证的 Java Web 应用程序。它工作正常,但我正在尝试将其配置为能够连接到 2 个不同的服务器。所以我把这个语法放在我的属性中:

env.put(Context.PROVIDER_URL, 
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL") + ":636 " +
        "LDAP://" + ParametrosManager.readParametro("LDAP_PROVIDER_URL2") + ":636" 
        );
System.out.println(env.get(Context.PROVIDER_URL));
// it prints LDAP://psfjfhsj.com.br:636 LDAP://myRealLdap.com.br:636

所以它们是两个空格分隔的 ldap URL。第一个不是真实地址,第二个是我的 ldap 服务器之一。但是我的连接尝试失败了,因为我的应用程序找不到第一台服务器!这是一些控制台输出:

javax.naming.CommunicationException: psfjfhsj.com.br:636 [Root exception is java.net.UnknownHostException: psfjfhsj.com.br]
 at com.sun.jndi.ldap.Connection.<init>(Connection.java:226)
 (...)
Caused by: java.net.UnknownHostException: psfjfhsj.com.br

我正在调试 ssl 连接(-Djavax.net.debug=ssl在我的服务器中使用标志),我可以看到我的真实主机 ( myRealLdap.com.br) 连接并握手正常。当然假的 URL 是找不到的,但这不是对“服务器宕机”的真实模拟吗?

我正在使用wildfly 9.0.2带有openjdk 1.8.0_242.

谢谢

标签: javaactive-directoryldapwildfly

解决方案


根据Oracle,您实现的代码应该支持这一点:

除了一个 URL,您还可以提供一个以空格分隔的 URL 列表。在这种情况下,LDAP 提供程序将依次尝试使用每个 URL,直到它能够创建成功的连接。然后,LDAP 提供者会将 Context.PROVIDER_URL 属性设置为成功的 URL,以便应用程序可以确定正在使用哪个 URL。

根据您的堆栈跟踪,我们UnknownHostException文档中声明它被抛出以指示无法确定主机的 IP 地址。基本上,此错误是针对 DNS 未命中而引发的。

在互联网上进行深入研究时,我发现其他人的问题与您的问题非常接近(在 LDAP 连接期间出现同样的错误(此处此处此处)。所有这些问题都已通过更新 DNS 以包含未知的主机名来解决。

这导致了我对 Oracle 文档的解释。 当他们说,LDAP 提供者将依次尝试使用每个 URL,直到它能够创建成功的连接,这意味着连接可能会因为服务器关闭而不是因为它不存在而被拒绝。


推荐阅读