没有基础的OpenLDAP搜索失败

时间:2015-07-07 14:22:27

标签: java spring-security ldap openldap spring-ldap

我正在尝试使用Springs LDAPTemplate从OpenLDAP检索用户(实际上是第三方框架),并注意到一些奇怪的行为。

当我使用LDAPTemplate搜索时:

base:ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
filter:(cn=someUsername)

它工作正常,我让用户回来了。

但是,当我用这个搜索时:

base:
filter=(cn=someUsername,ou=something,ou=somethingElse,dc=oh,dc=my,dc=god)

我什么都没得到,而是收到错误消息:

javax.naming.NameNotFoundException: [LDAP: error code 32 - No Such Object]; remaining name ''

这两个搜索不应该是等价的,因为它们指的是LDAP中的完全相同的路径吗?

如上所述,这是由Spring security 3.1.3.RELEASE中的第三方LdapUserDetailsService完成的。

有问题的方法如下:

public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    DirContextOperations userData = userSearch.searchForUser(username);

    return userDetailsMapper.mapUserFromContext(userData, username,
            authoritiesPopulator.getGrantedAuthorities(userData, username));
}

这里奇怪的是userSearch.serachForUser使用单独的base和filter,并正确地检索用户,但是当从authoritiesPopulator获取权限时,它会重复搜索,只有空基和过滤器中的所有内容,由于上述错误而失败。

更新

我已经尝试通过直接针对OpenLDAP运行ldapsearch来绕过Spring-stuff,并且我得到了相同的行为。似乎与OpenLDAP有关..

1 个答案:

答案 0 :(得分:0)

您必须至少使用要查询的数据库的基本DN。在这种情况下,可能是dc=oh,dc=my,dc=god。或者在连接URL中包含它。