0

我正在尝试使单点登录解决方案正常工作,该解决方案以前曾与 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中的一个错误吗?还是我在这里做错了什么?

4

1 回答 1

0

通过摆脱定义 ldap 用户服务的“模板”方式,设法修复它:

前:

  <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>

不要问我这是如何或为什么起作用的..

于 2015-08-11T10:42:50.813 回答