如何获取DN在LDAP使用LDAP UnboundID SDK用户ID(how to get DN

2019-07-30 15:32发布

我试图让一个DN(可能不止一个)的用户的时候我唯一的参数是用户ID

还我使用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

从头部谢谢

Answer 1:

在这种情况下的问题是,“匹配的DN”元素是不是你认为它是。 这并不是说与搜索条件匹配的条目(其可以实际上是零个,一个或多个条目)的DN。 如果该操作的目标不存在的响应的匹配DN元件可以被提供。 对于搜索操作,如果您已指定了一个搜索基本DN不存在,那么匹配的DN可以指定最接近的条目的DN到您指定什么实际上并在服务器存在。 例如,如果您已指定的“OU =不存在,DC =例如,DC = COM”,搜索基准DN不存在,但“DC =例如,DC = COM”项不存在的条目,那么服务器可能返回 “DC =例如,DC = COM” 的匹配的DN值。

如果你的搜索匹配的一个或多个条目,然后(除非你使用了搜索结果的倾听者,这是不是在你上面提供的例子的情况下),匹配项将通过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);


文章来源: how to get DN in LDAP with user ID using UnboundID LDAP SDK