4

当我拥有的唯一参数是用户 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

非常感谢

4

1 回答 1

5

这种情况下的问题是“匹配的 DN”元素不是您认为的那样。它不是匹配搜索条件的条目的 DN(实际上可能是零个、一个或多个条目)。如果操作的目标不存在,则可以提供响应的匹配 DN 元素。对于搜索操作,如果您指定了一个不存在的搜索基础 DN,那么匹配的 DN 可能会指定与您指定的、服务器中实际存在的条目最接近的条目的 DN。例如,如果您指定了“ou=nonexistent,dc=example,dc=com”的搜索基础 DN,它不存在但条目“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);
于 2012-07-26T17:21:23.903 回答