【发布时间】:2020-03-03 10:07:09
【问题描述】:
我正在开发一个需要连接到 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) 连接并握手正常。假网址当然是找不到的,但这不就是“服务器宕机”的真实模拟吗?
我正在使用带有openjdk 1.8.0_242 的wildfly 9.0.2 服务器。
谢谢
【问题讨论】:
-
更有可能导致目标主机无法访问或连接被拒绝。您确定这是列出多个服务器的正确方法吗?
-
我也觉得这很有趣,但这似乎是正确的方法。以下是一些表明它的链接:stackoverflow.com/questions/14459280/… 和 docs.oracle.com/javase/jndi/tutorial/ldap/misc/url.html
-
您是否尝试使用以下命令? // 创建初始上下文 DirContext ctx = new InitialDirContext(env); // 查看使用了哪个服务器 System.out.println(ctx.getEnvironment().get(Context.PROVIDER_URL));?
-
如果我使用
realHost1.com realHost2.com,打印出来的只是第一个的地址。如果我使用fakeHost.com realHost2.com,它只打印真实主机的 URL,尽管它是列表中的第二个 URL,并给我 CommunicationException。 -
我猜这是一个 openjdk 问题(可能没有实现?)。我在 openjdk 文档中找不到对这个多 URL 选项的任何引用。您可以尝试使用 oracle 更改 JDK,因为根据 @BrunoLamps 发布的链接有支持吗?
标签: java active-directory ldap wildfly