Spring 具有组织单位的 LDAP 搜索 returns 零个结果
Spring LDAP search with organisational units returns zero results
我正在开发一个简单的 java 命令行软件,它使用 Spring LDAP 执行递归 LDAP 搜索,从指定组开始并搜索指定组和子组中的所有用户.
如果组专有名称包含组织单位 (=ou),搜索将无法找到任何内容,但在其他情况下可以。
这是实现的简短版本,省略了递归:
private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) {
// recursion guard omitted
String base = groupName.substring(groupName.indexOf(',') + 1);
AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "group")).and(new EqualsFilter("memberof", groupName));
List<String> subgroups = ldapTemplate.search(base, filter.encode(), new GroupNameMapper());
// recursive calls for subgroups omitted
getAllUsers(users, ldapTemplate, groupName, base);
}
private void getAllUsers(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName, String base) {
AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("memberof", groupName));
// Paged search omitted.
List<UserDTO> result = ldapTemplate.search(base,filter.encode(),new UserAttributesMapper());
users.addAll(result);
}
GroupNameMapper
returns distinguishedName as Strings 和 UserAttributesMapper
returns 来自不同属性的用户对象,例如 sAMAccountName
和 givenName
.
代码(递归)找到第一个测试组中的所有 36 个用户,其中指定的组如下:
CN=import_users,CN=Users,DC=example,DC=test,DC=org
在完全相同的测试环境中,当组可分辨名称包含一个或多个组织单位时,它 returns 零个人和子组,例如
CN=import_users,OU=testou,DC=example,DC=test,DC=org
这不可能是由于错误的组专有名称,"memberof" 不工作或组不包含用户,因为我测试了查找:
String[] test = (String[])ldapTemplate.lookup("CN=import_users,OU=testou,DC=example,DC=test,DC=org", new ContextMapper() {
public Object mapFromContext(Object ctx) {
DirContextAdapter adapter = (DirContextAdapter) ctx;
return adapter.getStringAttributes("Member");
}
});
找到
CN=John Doe,CN=Users,DC=example,DC=test,DC=org
并查找用户 John Doe
String[] test = (String[])ldapTemplate.lookup("CN=John Doe,CN=Users,DC=example,DC=test,DC=org", new ContextMapper() {
public Object mapFromContext(Object ctx) {
DirContextAdapter adapter = (DirContextAdapter) ctx;
return adapter.getStringAttributes("memberof");
}
});
给出结果:
CN=import_users,OU=testou,DC=example,DC=test,DC=org
CN=import_users,CN=Users,DC=example,DC=test,DC=org
为什么涉及组织单位时搜索不到任何内容?
图书馆用户:
spring-ldap-核心-2.0.4.RELEASE
细节决定成败:
群组CN=import_users,OU=testou,DC=example,DC=test,DC=org
的成员是
CN=John Doe,CN=Users,DC=example,DC=test,DC=org
但您似乎在搜索
下的用户
OU=testou,DC=example,DC=test,DC=org
也就是说,似乎所有用户都在 CN=Users,DC=example,DC=test,DC=org
下,但当您实际搜索用户时,您假设他们是相对于组放置的。
我正在开发一个简单的 java 命令行软件,它使用 Spring LDAP 执行递归 LDAP 搜索,从指定组开始并搜索指定组和子组中的所有用户.
如果组专有名称包含组织单位 (=ou),搜索将无法找到任何内容,但在其他情况下可以。
这是实现的简短版本,省略了递归:
private void searchLdapGroup(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName) {
// recursion guard omitted
String base = groupName.substring(groupName.indexOf(',') + 1);
AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "group")).and(new EqualsFilter("memberof", groupName));
List<String> subgroups = ldapTemplate.search(base, filter.encode(), new GroupNameMapper());
// recursive calls for subgroups omitted
getAllUsers(users, ldapTemplate, groupName, base);
}
private void getAllUsers(List<UserDTO> users, LdapTemplate ldapTemplate, String groupName, String base) {
AndFilter filter = new AndFilter().and(new EqualsFilter("objectclass", "person")).and(new EqualsFilter("memberof", groupName));
// Paged search omitted.
List<UserDTO> result = ldapTemplate.search(base,filter.encode(),new UserAttributesMapper());
users.addAll(result);
}
GroupNameMapper
returns distinguishedName as Strings 和 UserAttributesMapper
returns 来自不同属性的用户对象,例如 sAMAccountName
和 givenName
.
代码(递归)找到第一个测试组中的所有 36 个用户,其中指定的组如下:
CN=import_users,CN=Users,DC=example,DC=test,DC=org
在完全相同的测试环境中,当组可分辨名称包含一个或多个组织单位时,它 returns 零个人和子组,例如
CN=import_users,OU=testou,DC=example,DC=test,DC=org
这不可能是由于错误的组专有名称,"memberof" 不工作或组不包含用户,因为我测试了查找:
String[] test = (String[])ldapTemplate.lookup("CN=import_users,OU=testou,DC=example,DC=test,DC=org", new ContextMapper() {
public Object mapFromContext(Object ctx) {
DirContextAdapter adapter = (DirContextAdapter) ctx;
return adapter.getStringAttributes("Member");
}
});
找到
CN=John Doe,CN=Users,DC=example,DC=test,DC=org
并查找用户 John Doe
String[] test = (String[])ldapTemplate.lookup("CN=John Doe,CN=Users,DC=example,DC=test,DC=org", new ContextMapper() {
public Object mapFromContext(Object ctx) {
DirContextAdapter adapter = (DirContextAdapter) ctx;
return adapter.getStringAttributes("memberof");
}
});
给出结果:
CN=import_users,OU=testou,DC=example,DC=test,DC=org CN=import_users,CN=Users,DC=example,DC=test,DC=org
为什么涉及组织单位时搜索不到任何内容?
图书馆用户: spring-ldap-核心-2.0.4.RELEASE
细节决定成败:
群组CN=import_users,OU=testou,DC=example,DC=test,DC=org
的成员是
CN=John Doe,CN=Users,DC=example,DC=test,DC=org
但您似乎在搜索
下的用户OU=testou,DC=example,DC=test,DC=org
也就是说,似乎所有用户都在 CN=Users,DC=example,DC=test,DC=org
下,但当您实际搜索用户时,您假设他们是相对于组放置的。