Spring-安全创建格式错误的 ldap 查询

Spring-security creates malformed ldap-query

我正在尝试使单点登录解决方案正常工作,该解决方案以前曾作为 LDAP 提供程序与 Novell eDirectory 一起使用。现在,我正试图让它与 OpenLDAP 一起工作。在登录过程中,其中一个步骤是从 LDAP 中检索实际用户。这是由 Spring-security 完成的,但它似乎有一个错误。

为了获取用户,调用了LdapUserDetailsService#loadUserByUsername。这使用预定义的 LdapUserSearch 来查找具有给定用户名的用户。在我的例子中,配置看起来像这样:

base:ou=something,ou=somethingElse,dc=oh,dc=my,dc=god
filter:cn={0}

其中 {0} 替换为实际用户名。到目前为止,这是可行的,并且以 FilterBasedLdapUserSearch#searchForUser 返回的用户数据的形式检索了用户。但是,userdata 不区分 dn 和 base,所以它有:

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

此用户数据对象又用于检索用户的权限,因此它尝试使用上面的基础进行另一次搜索,并将 dn 作为过滤器。但是,这个查询失败了,因为 OpenLDAP 不允许任何以空字符串为基础的查询。

我试过 3.1.3.RELEASE、3.1.7.RELEASE 和 3.2.7.RELEASE,都有同样的问题。

这是 spring-security 中的错误吗?还是我做错了什么?

通过放弃定义 ldap 用户服务的 "template" 方式设法修复它:

之前:

  <sec:ldap-user-service id="ldapUserDetailsService"
                     server-ref="contextSource"
                     user-search-filter="${my.ldap.filter}"
                     user-search-base="${my.ldap.base}"
                     user-context-mapper-ref="myUserDetailsContextMapper"/> 

之后:

  <bean id="userSearch"
        class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
    <constructor-arg index="0" value="${my.ldap.base}"/>
    <constructor-arg index="1" value="${my.ldap.filter}"/>
    <constructor-arg index="2" ref="contextSource"/>
  </bean>

  <bean id="ldapAuthoritiesPopulator" class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
    <constructor-arg ref="contextSource"/>
      <constructor-arg value="${my.ldap.usersearch.base}"/>
      <property name="groupSearchFilter" value="${my.group.filter}" />
      <property name="groupRoleAttribute" value="${my.group.attribute}" />
    <property name="searchSubtree" value="true" />
  </bean>

  <bean id="ldapUserDetailsService" class="org.springframework.security.ldap.userdetails.LdapUserDetailsService">
    <constructor-arg ref="userSearch"/>
    <constructor-arg ref="ldapAuthoritiesPopulator"/>
  </bean>

不要问我这是如何或为什么有效的..