没有基础的 OpenLDAP 搜索失败
Posted
技术标签:
【中文标题】没有基础的 OpenLDAP 搜索失败【英文标题】:OpenLDAP search without base fails 【发布时间】:2015-09-25 02:25:36 【问题描述】:我正在尝试使用 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 三中引用完全相同的路径?
如前所述,这是由第三方 LdapUserDetailsService
在 Spring security 3.1.3.RELEASE 中完成的。
有问题的方法如下所示:
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
获取权限时,它重复搜索,只有一个空的base和filter中的所有内容,由于上述错误而失败。
更新:
我尝试通过直接针对 OpenLDAP 运行 ldapsearch
来绕过 Spring-stuff,并且我得到了相同的行为。似乎是 OpenLDAP 的东西..
【问题讨论】:
【参考方案1】:您必须至少使用您正在查询的数据库的基本 DN。在这种情况下,可能是dc=oh,dc=my,dc=god
。或者将其包含在连接 URL 中。
【讨论】:
好的,这对所有 ldap 提供程序都是如此吗?因为我在其他地方运行完全相同的代码,只是使用 Novell eDirectory 而不是 OpenLDAP。但话又说回来,不会是 eDirectory 第一次接受不属于 ldap 标准的东西。奇怪的是,虽然 Spring Security 会这样做,但至少我有地方可以挖掘。 一个空的 baseDN 意味着从根开始,并且应该根据 RFC 4511 得到支持。以上是关于没有基础的 OpenLDAP 搜索失败的主要内容,如果未能解决你的问题,请参考以下文章