Java 如何获取与用户相关的所有用户(直接和间接)

Java 如何获取与用户相关的所有用户(直接和间接),java,active-directory,ldap,Java,Active Directory,Ldap,我有一个问题,我必须使用自定义LDAP属性获取与某个用户相关的所有用户,因为现在我只能通过使用递归函数和查询来实现这一点,该查询将随着每次调用而不断增长,我知道这不会扩展,是否有更好的方法来实现这一点 这是我使用的代码 /* * at start accumlatedUsers === usersToBeSearched accumlatedUsers will be * updated */ public void GetSubordinatesRecurisve(ArrayList&l

我有一个问题,我必须使用自定义LDAP属性获取与某个用户相关的所有用户,因为现在我只能通过使用递归函数和查询来实现这一点,该查询将随着每次调用而不断增长,我知道这不会扩展,是否有更好的方法来实现这一点

这是我使用的代码

/*
 * at start accumlatedUsers === usersToBeSearched accumlatedUsers will be
 * updated
 */
public void GetSubordinatesRecurisve(ArrayList<String> usersToBeSearched, ArrayList<String> accumlatedUsers)
        throws NamingException {

    String searchFilter = "(&(ObjectCategory=User)(|";
    for (String user : usersToBeSearched) {
        searchFilter += "(supeirorName=" + user + ")";
    }
    searchFilter += "))";

    SearchControls searchControls = new SearchControls();
    searchControls.setSearchScope(SearchControls.SUBTREE_SCOPE);

    NamingEnumeration<SearchResult> results = ldapContext.search(ldapSearchBase, searchFilter, searchControls);

    ArrayList<String> usersFounded = new ArrayList<String>();
    SearchResult searchResult = null;
    while (results.hasMoreElements()) {
        searchResult = (SearchResult) results.nextElement();
        usersFounded.add((String) searchResult.getAttributes().get("sAMAccountName").get());
    }

    accumlatedUsers.addAll(usersFounded);

    if (usersFounded.size() != 0) {
        this.GetSubordinatesRecurisve(usersFounded, accumlatedUsers);
    }

    return;
}
/*
*开始时,accumlatedUsers===用户搜索的accumlatedUsers将
*更新
*/
public void getsubstancescurisve(ArrayList userstobesearch,ArrayList accumlatedUsers)
抛出NamingException{
String searchFilter=“(&(ObjectCategory=User)(|”);
for(字符串用户:userstobesearch){
searchFilter+=“(SupeErrorName=“+user+”);
}
搜索过滤器+=”);
SearchControls SearchControls=新的SearchControls();
searchControls.setSearchScope(searchControls.SUBTREE_范围);
NamingEnumeration results=ldapContext.search(ldapSearchBase、searchFilter、searchControls);
ArrayList usersFounded=新的ArrayList();
SearchResult SearchResult=null;
while(results.hasMoreElements()){
searchResult=(searchResult)results.nextElement();
usersFounded.add((字符串)searchResult.getAttributes().get(“sAMAccountName”).get());
}
acumlatedusers.addAll(usersFounded);
如果(usersFounded.size()!=0){
此.getsubsidersRecurisve(usersFounded、accumlatedUsers);
}
返回;
}

谢谢。

是的,问题是您的查询
ldapContext.search
中的用户数将呈指数增长,因此它根本无法扩展。例如,第一个查询针对1个用户,第二个查询针对3个用户,第三个查询针对9个用户,依此类推

与单个用户相关的用户可以被视为一棵树(如果没有周期)。最常见的遍历树的方法是深度优先搜索(DFS)或面包优先搜索(BFS)算法。如果您的目标是查找与某个用户相关的所有用户,则任何一个选项都可以

DFS(或BFS)比您的解决方案更具可扩展性,因为它总是以每次1个用户查询LDAP

我无法测试您的方法,但我正在向您展示如何实现DFS:

/。。。
acumlatedusers.addAll(usersFounded);
for(字符串userFounded:usersFounded){
如果(!visted.contains(userFounded)){
已访问。添加(用户创建);
List singleUserList=new ArrayList();
singleUserList.add(userFounded);
this.getsubsidersRecurisve(singleUserList,accumlatedUsers);
}
}
返回;

注意访问列表,它是为了防止用户图表中出现循环。

谢谢,但我认为我仍然会遇到同样的问题,例如,如果我有10000个相关用户,那么我将不得不发出10000个请求,这在任何方面都可行吗?对于LDAP来说,10k请求并不多,但是如果你认为这是瓶颈的话,它肯定是可以改进的。LDAP是本地的还是远程的?LDAP中总共有多少用户?AD在本地环境中的另一台机器中,大约有5000个用户,但我不知道未来。好的。你多久打一次电话给GetSubsidersRecurisve?如果每天吃一次就好了。如果经常使用,那么可以缓存结果(因为我认为它不会经常更改)。我会使用一个简单的解决方案(DFS),并最终通过缓存对其进行改进,而不是现在进行过度优化。如果你认为有用,请投赞成票;)