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>
不要问我这是如何或为什么有效的..
我正在尝试使单点登录解决方案正常工作,该解决方案以前曾作为 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>
不要问我这是如何或为什么有效的..