【问题标题】:What's the simplest (i.e least complex) possible LDAP operation什么是最简单(即最不复杂)可能的 LDAP 操作
【发布时间】:2011-05-05 05:18:17
【问题描述】:

我已经使用 Apache commons-pool 实现了一个用于 LDAP 连接的池。我无法使用 JNDI (http://download.oracle.com/javase/jndi/tutorial/ldap/connect/pool.html) 提供的池功能,因为我使用 SSL 连接(使用自定义(Oracle 提供)套接字工厂(java.naming.ldap.factory.socket env 值集)将上下文从 JNDI 池中取消资格)到 LDAP 服务器,因此即使设置了相应的池属性,也会自动禁用 JNDI 中的池设施。

现在到了InitialDirContext 的池化实例被返回到池中并且需要检查它是否仍然可用并且没有被用户关闭或丢失与 LDAP 服务器的连接的地步由于其他原因。

这是我目前查找已知存在的特定用户的 DN 的地方:

 final InitialDirContext ctx = internalPooledLDAPConnection.getCtx();
 final Subscriber sub = internalPooledLDAPConnection.getSub();

 SearchControls ctls = new SearchControls();
 ctls.setSearchScope(2);
 ctls.setReturningAttributes(new String[] { "dn"});
 NamingEnumeration resultSet = ctx.search(sub.getUserSearchBase()[0], "(&(objectclass=*)(uid=orcladmin))", ctls);

如果此操作未引发任何异常,则我内部池化 Ldap 连接中的 InitialDirContext 仍然可用,并且可以安全地从池中取出以供重新使用。

但是我想知道这是否是可以在这里执行的“最便宜”的连接完整性检查,或者是否存在我可以使用的更便宜的 LDAP 操作。

【问题讨论】:

    标签: java ldap jndi connection-pooling


    【解决方案1】:

    LDAP 比较操作可能比搜索更有效,因为只有一个响应(对于匹配条目的搜索,您将有两个响应 - 一个用于条目,另一个用于指示搜索结果的末尾)。

    但是,您可能还想考虑 JNDI 的替代方案,因为它为 LDAP 提供了一个臭名昭著的糟糕 API。还有其他用于执行 LDAP 通信的 Java 库比 JNDI 好得多。特别是,UnboundID LDAP SDK for Java(我是它的开发人员)为 LDAP 通信提供了一个功能丰富、易于使用、高性能的 API。它具有丰富的连接池功能,包括健康检查、故障转移和负载平衡。请参阅https://docs.ldap.com/ldap-sdk/docs/advantages/comparison.html,了解 UnboundID LDAP SDK 与 JNDI 和 Netscape Directory SDK for Java 提供的功能的比较。

    【讨论】:

    • 感谢您的建议。不幸的是,我无法从 JNDI 切换到其他东西,因为我使用了一些依赖于 JNDI LDAP 连接的 Oracle appserver 库。
    【解决方案2】:

    LDAP 绑定非常简单。这是 JNDI 中的 reconnect() 方法。

    但是,您必须对您正在做的事情有所保留。如果通过 SSL 禁用池化,肯定是出于安全原因,因此您需要在设计自己的池化时进行自己的安全分析。

    【讨论】:

    • 感谢您指出潜在的安全问题 - 我会调查一下。
    【解决方案3】:

    我也遇到了类似的问题(我滚动了自己的游泳池)。我的方法是期望任何池连接都死了。我让我的池执行任何查询两次:第一次它可能会失败,所以重新连接并重试,但第二次尝试的失败是真实的,并且会向上传播。

    总而言之,我没有使用特定的 ping 查询,而是让应用程序自己的查询充当潜在的 ping。

    就最便宜的查询而言,这可能非常便宜!你甚至可能不需要为这个绑定 - 我不记得了。

    // The rootDSE attributes, Microsoft Active Directory
    Attributes attrs = ldapContext.getAttributes("");
    String ldapRootDN = (String) attrs.get("rootDomainNamingContext").get(0);
    

    【讨论】:

      【解决方案4】:

      我们对控件 0.0.0.0.0 进行检查,当然该控件永远不会存在来测试连接是否处于活动状态。我记得这就是 OpenLDAP (jldap) 调用进行检查的方式。作为控制它的 rootDSE 通常允许匿名,这将检查连接是否良好,但不检查绑定状态。

      【讨论】:

      • 发送 0.0.0.0 的 JLDAP 检查只检测到已被服务器关闭的连接,它不会检测到因服务器崩溃或网络关闭而挂起的连接。
      【解决方案5】:

      为什么不发送对未知或垃圾属性的无效搜索。整个重点只是 ping,而不是实际过程。

      【讨论】:

      • 试过了,与找到现有条目没有显着差异(操作持续时间),但还是谢谢。
      猜你喜欢
      • 2010-09-20
      • 2012-06-29
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 2015-04-22
      • 1970-01-01
      相关资源
      最近更新 更多