【发布时间】:2020-09-07 09:50:40
【问题描述】:
当群组的成员超过 1500 人时,我的 ldap 连接出现问题。我可以用下面的代码 sn-p 来解决它。尽管如此,我对硬编码的 PAGESIZE 变量非常不满意。由于这是 AD-Server 上的设置,我不知道这是否会改变以及何时改变。所以我的问题是,如果我可以使用 javax-library 或任何其他库动态获取此 pagesize 值?
如果有人知道解决此问题的完全不同的方法,我也很感兴趣。我认为必须有更好的方法在generateRangeString(int i) 函数中生成这个成员字符串。
package main.java;
import javax.naming.Context;
import javax.naming.NamingEnumeration;
import javax.naming.NamingException;
import javax.naming.directory.SearchControls;
import javax.naming.directory.SearchResult;
import javax.naming.ldap.InitialLdapContext;
import javax.naming.ldap.LdapContext;
import java.util.Properties;
public class LdapService {
private static final int PAGESIZE = 1500;
public void printAllMembersOfSpecificGroup() throws Exception {
// Initialize
LdapContext ldapContext = null;
NamingEnumeration<SearchResult> results = null;
NamingEnumeration<?> members = null;
try {
Properties properties = new Properties();
properties.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
properties.put(Context.PROVIDER_URL, "ldap://url");
properties.put(Context.SECURITY_AUTHENTICATION, "simple");
properties.put(Context.SECURITY_PRINCIPAL, "Security Principle");
properties.put(Context.SECURITY_CREDENTIALS, "password");
ldapContext = new InitialLdapContext(properties, null);
int range = 0;
boolean finish = false;
while (finish != true) {
// Set search controls
SearchControls searchCtls = new SearchControls();
searchCtls.setSearchScope(SearchControls.SUBTREE_SCOPE);
searchCtls.setReturningAttributes(generateRangeArray(range));
// Get results
results = ldapContext.search("base string", String.format("(CN=%s)", "Group name"), searchCtls);
if (results.hasMoreElements() == true) {
SearchResult result = results.next();
try {
if(result.getAttributes().get(generateRangeString(range)) == null){
members = result.getAttributes().get(generateLastRangeString(range)).getAll();
} else {
members = result.getAttributes().get(generateRangeString(range)).getAll();
}
while (members.hasMore()) {
String distinguishedName = (String) members.next();
System.out.println(distinguishedName);
}
range++;
} catch (Exception e) {
// Fails means there is no more result
e.printStackTrace();
finish = true;
}
}
}
} catch (NamingException e) {
throw new Exception(e.getMessage());
} finally {
if (ldapContext != null) {
ldapContext.close();
}
if (results != null) {
results.close();
}
}
}
public static String[] generateRangeArray(int i) {
String range = "member;range=" + i * PAGESIZE + "-" + ((i + 1) * PAGESIZE - 1);
String[] returnedAtts = { range };
return returnedAtts;
}
public static String generateRangeString(int i) {
String range = "member;range=" + i * PAGESIZE + "-" + ((i + 1) * PAGESIZE - 1);
return range;
}
public static String generateLastRangeString(int i) {
String range = "member;range=" + i * PAGESIZE + "-" + "*";
return range;
}
}
【问题讨论】:
标签: java active-directory ldap jndi