Ldap简单用户搜索返回LDAP:错误代码53 - 不愿意处理未索引的搜索操作

问题描述 投票:0回答:1

我不是 LDAP 专家,我所做的只是在

users
上运行一些过滤器,例如获取以某个前缀开头的用户名。每次我在
*
中使用
filter
时都会收到错误:

[LDAP: error code 53 - Unwilling to process the unindexed search operation]; remaining name 'ou=internal,o=XXX,c=us'

此后就没有发出任何消息,甚至不确定该错误消息是什么意思。

传入

filter
用户名的精确匹配效果很好:

String filter = "uid=exactMatchuserName";

SearchControls constraints = new SearchControls();
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);
constraints.setReturningAttributes(attrIdsToSearch);

NamingEnumeration users = ldapConnection().search(
    "ou=internal,o=XXX,c=us",
    filter,
    constraints
);

但是当我在搜索中使用

*
String filter = "uid=*ma";
然后我收到错误

java active-directory ldap
1个回答
0
投票

服务器告诉您它不愿意执行无法使用索引的搜索。如果你不知道什么是索引,你可以阅读维基百科关于数据库索引的文章,但简而言之:

索引用于快速定位数据,而无需每次访问数据库表时都搜索数据库表中的每一行。

索引是通过按照索引中指定的方式对其中一列进行排序而构建的(对于字符串列,通常按字母顺序排列)。因此,例如,如果我搜索

uid=gabriel
,则不需要查看目录中的每个用户。它可以直接跳到 G 并快速找到它。

但是,这意味着只有当您至少知道第一个字母时才能使用索引。当您在搜索开头使用通配符时,您不知道第一个字母,因此无法使用索引,并且需要检查目录中的每个用户是否匹配。

您有 3 个选择:

  1. 请勿在开头放置通配符。
  2. 向使用索引属性的查询添加另一个条件,然后您就可以在
    uid
    中使用通配符。您只需要至少一个索引标准。
  3. 在您的服务器上启用未索引的搜索。您标记了 ,但我怀疑这不是您使用的,因为 AD 不使用
    uid
    属性。因此,在线搜索您正在使用的目录服务器,看看是否可以启用。请记住,禁用未索引的搜索是默认设置是有原因的。
© www.soinside.com 2019 - 2024. All rights reserved.