我正在尝试使用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有关..
答案 0 :(得分:0)
您必须至少使用要查询的数据库的基本DN。在这种情况下,可能是dc=oh,dc=my,dc=god
。或者在连接URL中包含它。