使用LDAP和自定义UserDetailsContextMapper的Spring Security

时间:2011-03-04 14:43:40

标签: ldap spring-security

我正在尝试使Spring Security 3.05与修改后的UserDetailsContextMapper一起工作,以便我可以从他们需要的方式获取更多信息,这项任务似乎相当简单,但没有成功。

我已将Spring Security配置为使用以下bean的LDAP身份验证:

<bean id="contextSource"
    class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
    <constructor-arg value="ldaps://192.168.1.102:636" />
    <property name="userDn" value="manager" />
    <property name="password" value="password" />
</bean>

<bean id="ldapAuthProvider"
    class="org.springframework.security.ldap.authentication.LdapAuthenticationProvider">
    <constructor-arg>
        <bean class="org.springframework.security.ldap.authentication.BindAuthenticator">
            <constructor-arg ref="contextSource" />
            <property name="userSearch">
                <bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
                    <constructor-arg index="0" value="" />
                    <constructor-arg index="1" value="(mail={0})" />
                    <constructor-arg index="2" ref="contextSource" />
                </bean> 
            </property>
        </bean>
    </constructor-arg>
    <property name="userDetailsContextMapper" ref="myContextMapper" />
</bean>

但即使我已将myContextMapper定义为:

<bean id="myContextMapper" class="com.mypackage.MyLDAPUserDetailsMapper">
    <property name="rolePrefix" value="TEST_PREFIX" />
</bean>

它不起作用。意味着忽略了自定义映射器(我没有得到任何调试输出)。

P.S。 applicationContext-security.xml可以在下面看到,除了被忽略的自定义UserDetailsMapper,身份验证和角色分配工作正常。

<authentication-manager>
    <ldap-authentication-provider server-ref="contextSource"/>
</authentication-manager>

1 个答案:

答案 0 :(得分:9)

您不需要配置内置的UserDetailsContextMapper类。 Spring Security会根据所请求的UserDetailsContextMapper类的类型自动选择正确的LdapUserDetails,该类由user-details-class ldap-authentication-provider属性配置。如果您使用自己的上下文映射器,则使用属性user-context-mapper-ref配置它。