我正在使用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方法遵循引用,如果是这种情况,手动遵循引用或更改其行为的最佳方法是什么?
最佳答案
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);
}
}