java - 测试与多个 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
.
谢谢
解决方案
根据Oracle,您实现的代码应该支持这一点:
除了一个 URL,您还可以提供一个以空格分隔的 URL 列表。在这种情况下,LDAP 提供程序将依次尝试使用每个 URL,直到它能够创建成功的连接。然后,LDAP 提供者会将 Context.PROVIDER_URL 属性设置为成功的 URL,以便应用程序可以确定正在使用哪个 URL。
根据您的堆栈跟踪,我们UnknownHostException
在文档中声明它被抛出以指示无法确定主机的 IP 地址。基本上,此错误是针对 DNS 未命中而引发的。
在互联网上进行深入研究时,我发现其他人的问题与您的问题非常接近(在 LDAP 连接期间出现同样的错误(此处、此处和此处)。所有这些问题都已通过更新 DNS 以包含未知的主机名来解决。
这导致了我对 Oracle 文档的解释。 当他们说,LDAP 提供者将依次尝试使用每个 URL,直到它能够创建成功的连接,这意味着连接可能会因为服务器关闭而不是因为它不存在而被拒绝。
推荐阅读
- php - 如何在 php 中仅显示 mysql 数据库中的第一张图片
- javascript - nodemailer 电子邮件未发送且未记录错误
- javascript - 我正在尝试使用 node、nodemon、express 和 dotenv 发送电子邮件
- excel - 使用 VBA 替换 Excel 中的 Powerpoint 数据
- r - 如何获得由许多多边形从大栅格中剪裁的栅格中具有 NA 值的像素数?
- php - Laravel 和 Guzzle HTTP '406 不可接受'
- javascript - 从父元素javascript中删除类
- c# - 系统范围的全局列表变量是否存在
- javascript - 打字稿问题:受限制的属性类型不兼容
- r - 更改字符串中间单个字符的大小写