我正在尝试使单点登录解决方案正常工作,该解决方案以前曾与 Novell eDirectory 作为 LDAP 提供者一起使用。现在,我正试图让它与 OpenLDAP 一起使用。在登录过程中,其中一个步骤是从 LDAP 中检索实际用户。这是由 Spring-security 完成的,但它似乎有一个错误。
为了获取用户,LdapUserDetailsService#loadUserByUsername
被调用。这使用预定义LdapUserSearch
来查找具有给定用户名的用户。就我而言,配置如下所示:
base:ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
filter:cn={0}
where{0}
替换为实际的用户名。到目前为止,这是可行的,并且以返回的用户数据的形式检索了用户FilterBasedLdapUserSearch#searchForUser
。但是,用户数据并没有在 dn 和 base 之间分开,所以它有:
base: (empty)
dn:cn=someUsername,ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
这个 userdata-object 反过来用于检索用户的权限,因此它尝试使用上面的 base 进行另一个搜索,并将 dn 作为过滤器。但是,此查询失败,因为 OpenLDAP 不允许任何以空字符串为基础的查询。
我试过 3.1.3.RELEASE、3.1.7.RELEASE 和 3.2.7.RELEASE,都有同样的问题。
这是spring-security中的一个错误吗?还是我在这里做错了什么?