Spring Security中的LDAP + HttpBasicAuth问题

时间:2013-01-29 12:54:47

标签: spring-security ldap http-basic-authentication

我有这样的配置:

<security:http auto-config="true" use-expressions="true">
    <security:intercept-url pattern="/index.jsp" access="isAuthenticated()"/>
    <security:http-basic/>
</security:http>

然后,BasicAuthenticationFilter

<bean id="basicAuthenticationFilter"
      class="org.springframework.security.web.authentication.www.BasicAuthenticationFilter">
    <property name="authenticationEntryPoint" ref="BauthenticationEntryPoint"/>
    <property name="authenticationManager" ref="BauthenticationManager"/>
</bean>

入口点和经理被这样描述:

<bean id="BauthenticationEntryPoint"   class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
    <property name="realmName" value="Name Of Your Realm"/>
</bean>
<bean id="BauthenticationManager" class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref local="ldapAuthProvider"/>
        </list>
    </property>
</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="userDnPatterns">
                <list>
                    <value>sAMAccountName={0}</value>
                </list>
            </property>
        </bean>
    </constructor-arg>
    <constructor-arg>
        <bean
                class="org.springframework.security.ldap.userdetails.DefaultLdapAuthoritiesPopulator">
            <constructor-arg ref="contextSource"/>
            <constructor-arg value=""/>
        </bean>
    </constructor-arg>
</bean>

当我尝试访问/index.jsp时,我显示了一个stadart http auth窗口,它请求我输入我的用户名和密码。当我将其键入表单并按Enter时,没有任何操作 - 只需重新加载auth窗口即可。

我犯了哪个错误? 感谢。

1 个答案:

答案 0 :(得分:0)

独立声明bean并不意味着它们将覆盖命名空间配置中的等效bean。例如,<http-basic />会将BasicAuthenticationFilter添加到过滤器链(以及一个入口点),并且您声明自己的实例这一事实将无效。

就目前而言,您的命名空间配置忽略了您声明的过滤器和身份验证bean。您可以尝试使用:

<http use-expressions="true" authentication-manager-ref="BauthenticationManager">
    <intercept-url pattern="/index.jsp" access="isAuthenticated()"/>
    <http-basic />
</http>

这将使配置使用您的身份验证管理器。或者,您可以使用标准命名空间语法进行身份验证管理器并删除BauthenticationManager bean:

<authentication-manager>
    <authentication-provider ref="ldapAuthProvider" />
</authentication-manager>

无论哪种方式,您都应该阅读参考手册的namespace chapter,以了解它的工作原理。