【发布时间】:2021-12-27 05:04:06
【问题描述】:
我想在 LDAP 中向下搜索给定 CN 的报告层次结构,并使用 Manager 属性。任何人都可以帮助我们了解使用 Java 中的 LDAP 搜索过滤器是否有任何高效的方法来实现这一点?我尝试搜索不同的帖子,但找不到答案。
Ex:
-Dept Head(input CN) - -Level 3 User
--Manager 1 -Level 2 User
---Member 1 -Level 1 User
---Member 2 -Level 1 User
--Manager 2 -Level 2 User
---Member 3 -Level 1 User
---Member 4 -Level 1 User
--Manager 3 -Level 2 User
---Member 5 -Level 1 User
---Member 6 -Level 1 User
在上面的示例中,将输入 3 级用户 CN,我们应该检索他下面的所有用户,直到给定 CN 的 0 级(所有级别经理和成员)。
如果输入CN是1级用户CN
- 输出将包括 1 级用户以下的所有 0 级报告(输入 CN)
如果输入CN是2级用户CN
- 输出将包括 1 级用户(输入 CN)以下的所有 1 级和 2 级报告...等等
现在我正在为每个级别动态生成一个过滤器,并在下面的级别中使用该过滤器进行搜索。如果有更多级别,则搜索需要一些时间才能返回预期结果。
我的代码
protected static ArrayList<ValueCollection> getUserReportsTreeDetails(String accountName, String initial,
String url, String principal, String credentials, String searchFeilds, String resultFeildNames,
String managerAttribute) throws Exception {
InitialLdapContext adminContext = null;
try {
ArrayList<SearchResult> result = new ArrayList<SearchResult>();
Properties connectionProperties = new Properties();
connectionProperties.put("java.naming.factory.initial", initial);
connectionProperties.put("java.naming.provider.url", url);
connectionProperties.put("java.naming.referral", "ignore");
connectionProperties.put("java.naming.security.principal", principal);
connectionProperties.put("java.naming.security.credentials", credentials);
connectionProperties.put("javax.security.sasl.maxbuffer", 2000000);
adminContext = new InitialLdapContext(connectionProperties, null);
String filter;
filter = "(&(userstatus=active)(|(" + managerAttribute + "=" + accountName + ")(CN=" + accountName + ")))";
String searchFeildsArray[] = searchFeilds.split(",");
String resultFeildNamesArray[] = resultFeildNames.split(",");
NamingEnumeration<SearchResult> answers = null;
//
ArrayList<ValueCollection> values = new ArrayList<ValueCollection>();
try {
String baseDn = "ou=accounts"; // TODO: Change me
answers = adminContext.search(baseDn, filter, getSearchControlsForFetchUser(searchFeilds));
SearchResult userInfo;
if (!answers.hasMore()) {
// throw new Exception("User does not exist in AD");
return null;
}
try {
String Names = "";
int count = 0;
while (answers.hasMore()) {
ValueCollection data = new ValueCollection();
userInfo = (SearchResult) answers.next();
for (int i = 0; i < searchFeildsArray.length; i++) {
Attribute attr = userInfo.getAttributes().get(searchFeildsArray[i]);
if (attr != null) {
data.put(resultFeildNamesArray[i], new StringPrimitive(attr.get().toString()));
}
}
values.add(data);
String temp = userInfo.getAttributes().get("cn").get().toString();
if (!temp.equals(accountName)) {
Names = Names == "" ? temp : Names + "," + temp;
count++;
}
}
if (Names.length() > 0)
values = getData(Names, managerAttribute, adminContext, baseDn, searchFeilds, resultFeildNames,
values);
return values;
} catch (PartialResultException var10) {
throw new Exception("User does not exist in AD or credentials are invalid");
}
} finally {
if (answers != null) {
answers.close();
}
}
} finally {
if (adminContext != null) {
adminContext.close();
}
}
}
private static ArrayList<ValueCollection> getData(String accountNames, String managerAttribute,
InitialLdapContext adminContext, String baseDn, String searchFeilds, String resultFeildNames,
ArrayList<ValueCollection> values) throws Exception {
String filter = "";
String[] Names = accountNames.split(",");
filter = "(&(userstatus=active)(|";
for (String Name : Names) {
filter += "(" + managerAttribute + "=" + Name + ")";
}
filter += "))";
String searchFeildsArray[] = searchFeilds.split(",");
String resultFeildNamesArray[] = resultFeildNames.split(",");
NamingEnumeration<SearchResult> answers = null;
// String filter = "(" + managerAttribute + "=" + accountName + ")";
answers = adminContext.search(baseDn, filter, getSearchControlsForFetchUser(searchFeilds));
SearchResult userInfo;
String SearchedUsers = "";
int count = 0;
while (answers.hasMore()) {
ValueCollection data = new ValueCollection();
userInfo = (SearchResult) answers.next();
for (int i = 0; i < searchFeildsArray.length; i++) {
Attribute attr = userInfo.getAttributes().get(searchFeildsArray[i]);
if (attr != null) {
data.put(resultFeildNamesArray[i], new StringPrimitive(attr.get().toString()));
}
}
values.add(data);
String temp = userInfo.getAttributes().get("cn").get().toString();
SearchedUsers = SearchedUsers == "" ? temp : SearchedUsers + "," + temp;
count++;
}
if (SearchedUsers.length() > 0)
values = getData(SearchedUsers, managerAttribute, adminContext, baseDn, searchFeilds, resultFeildNames,
values);
return values;
}
【问题讨论】:
-
您使用的是哪个 LDAP 服务器?告诉我们您尝试了什么并显示日志或结果并阅读:stackoverflow.com/help/how-to-ask
-
部门是组织单位,经理 X 是用户吗?请更具体。我目前需要做出太多假设才能给你一个正确的答案。
-
@mvreijn 我已经更新了问题以更具体地说明需要什么
-
@jwilleke 我已经更新了问题以更具体地说明需要什么,我们正在使用提供 LDAP 服务的 Microfocus eDirectory
标签: java search filter ldap ldap-query