如何使用UnboundID LDAP SDK在LDAP中使用用户ID获取DN

时间:2012-07-26 08:35:59

标签: java ldap-query

当我拥有的唯一参数是user-id

时,我正在尝试获取用户的DN(可能不止一个)

我正在使用UnboundID LDap SDK,你可以看到:

public String getCustomerAdminDN(String uid)
{

    String result =null;
    String filter = "uid=" +uid;
    try {
        SearchResult searchResult = this.ldapConnection.search("",SearchScope.SUB,filter);

        result = searchResult.getMatchedDN();
    } catch (LDAPSearchException e) {
        throw new RuntimeException("Error in the searching query :" + e.getMessage());
    }

  return result;
}

让我们假设我的uid属于以下DN

感谢一位负责人

1 个答案:

答案 0 :(得分:4)

在这种情况下的问题是“匹配的DN”元素不是您认为的那样。它不是符合搜索条件的条目的DN(实际上可能是零,一个或多个条目)。如果操作的目标不存在,则可以提供响应的匹配的DN元素。对于搜索操作,如果您指定了不存在的搜索库DN,则匹配的DN可能会指定与您指定的实际存在于服务器中的最近条目的DN。例如,如果您指定的搜索基准DN为“ou =不存在,dc = example,dc = com”,但该项不存在,但条目“dc = example,dc = com”条目确实存在,那么服务器可以返回匹配的DN值“dc = example,dc = com”。

如果您的搜索与一个或多个条目匹配,那么(除非您使用了搜索结果侦听器,在上面提供的示例中不是这种情况),匹配条目将可通过getSearchEntries方法访问。例如:

 List<SearchResultEntry> searchEntries = searchResult.getSearchEntries();
 if (searchEntries.size() != 1)
 {
   // The search didn't match exactly one entry.
 }
 else
 {
   SearchResultEntry entry = searchEntries.get(0);
   result = entry.getDN();
 }

此外,当部分值可能来自用户输入时,从字符串表示构造过滤器时应该小心,因为这可能允许某种注入攻击。 LDAP注入比SQL更困难,通常更加良性,但并不完全不存在。因此建议不要:

 String filter = "uid=" + uid;

你使用:

 Filter filter = Filter.createEqualityFilter("uid", uid);