UnboundID LDAP SDK不遵循引荐

时间:2014-06-09 19:16:57

标签: java grails ldap referrals unboundid-ldap-sdk

我正在使用UnboundID LDAP Java SDK将Groovy / Grails应用程序连接到Active Directory。以下是我正在使用的连接选项:

  LDAPConnectionOptions options = new LDAPConnectionOptions()
  options.connectTimeoutMillis = 60000 // 1 minute
  options.followReferrals = true
  options.referralHopLimit = 10
  options.responseTimeoutMillis = 60000 // 1 minute
  options.useSynchronousMode = true

但是,我仍然继续使用结果代码10获取LDAPSearchExceptions,这意味着服务器发送了一个引用。将referralHopLimit更改为更高的数字也无济于事,因此显然库不遵循引用。

到目前为止,我似乎只在使用LDAPConnection.getEntry方法加载DN指定的特定条目时才遇到此问题。我在执行搜索时还没有收到它。所以我想知道是否getEntry方法不应该遵循引用,如果是这样的话,手动跟踪引用或改变它的行为的最佳方法是什么?

1 个答案:

答案 0 :(得分:2)

getEntry方法在后台使用搜索,因此如果搜索有效,那么getEntry也应该可以工作。我刚刚进行了快速测试,它对我有用。使用最新的LDAP SDK版本(2.3.6)和以下代码,我在推荐之后获得了预期的条目。如果我注释掉" opts.setFollowReferrals(true)"行,然后我得到推荐例外:

import com.unboundid.ldap.listener.*;
import com.unboundid.ldap.sdk.*;



public class ReferralTest
{
  public static void main(final String... args)
         throws Exception
  {
    final InMemoryDirectoryServerConfig cfg =
         new InMemoryDirectoryServerConfig("dc=example,dc=com");
    final InMemoryDirectoryServer ds1 = new InMemoryDirectoryServer(cfg);
    final InMemoryDirectoryServer ds2 = new InMemoryDirectoryServer(cfg);

    ds1.startListening();
    ds2.startListening();

    final LDAPConnectionOptions opts = new LDAPConnectionOptions();
    opts.setFollowReferrals(true);

    final LDAPConnection conn1 = ds1.getConnection(opts);
    final LDAPConnection conn2 = ds2.getConnection(opts);

    conn1.add(
         "dn: dc=example,dc=com",
         "objectClass: top",
         "objectClass: domain",
         "dc: example");
    conn1.add(
         "dn: ou=Referral Entry,dc=example,dc=com",
         "objectClass: top",
         "objectClass: organizationalUnit",
         "ou: Referral Entry",
         "description: This is a referral entry");

    conn2.add(
         "dn: dc=example,dc=com",
         "objectClass: top",
         "objectClass: domain",
         "dc: example");
    conn2.add(
         "dn: ou=Referral Entry,dc=example,dc=com",
         "objectClass: top",
         "objectClass: referral",
         "objectClass: extensibleObject",
         "ou: Referral Entry",
         "ref: ldap://127.0.0.1:" + ds1.getListenPort() +
              "/ou=Referral Entry,dc=example,dc=com");

    final Entry e = conn2.getEntry("ou=Referral Entry,dc=example,dc=com");
    System.out.println(e.toLDIFString());

    conn1.close();
    conn2.close();

    ds1.shutDown(true);
    ds2.shutDown(true);
  }
}