我试图让一个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
从头部谢谢
在这种情况下的问题是,“匹配的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);