Spring Security 中的 LDAP + HttpBasicAuth 问题

Posted

技术标签:

【中文标题】Spring Security 中的 LDAP + HttpBasicAuth 问题【英文标题】:Issue with LDAP + HttpBasicAuth in Spring Security 【发布时间】:2013-01-13 01:16:34 【问题描述】:

我有这样的配置:

<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 时,什么也没有发生 - 身份验证窗口只是重新加载,仅此而已。

我在哪里做错了? 谢谢。

【问题讨论】:

org.springframework.security 包启用调试日志并显示异常。 在认证过程本身似乎没有异常。也许我没有启用调试日志记录?我该怎么做?谢谢 如果我在身份验证窗口中点击取消按钮,当然会显示消息“错误 401: No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken” 我添加 现在我得到一个错误 401: Bad credentials跨度> 表示您的登录名/密码组合错误 【参考方案1】:

独立声明 bean 并不意味着它们将覆盖命名空间配置中的等效 bean。例如,&lt;http-basic /&gt; 会将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 以大致了解其工作原理。

【讨论】:

感谢您的回复,@LukeTaylor!但是,我得到 Bad credential 错误的事实让我认为正确的身份验证提供者正在努力。此外,如果我将 userDnPatterns 替换为我知道不会在 LDAP 树中对用户搜索给出任何结果的用户过滤器,我将收到 LDAP 32 错误 - 找不到用户。 在这种情况下,您发布的配置要么不完整,要么不是您正在使用的配置。您定义的BasicAuthenticationFilter 不可能包含在&lt;http/&gt; 创建的命名空间安全过滤器链中。也许您已经省略了 authentication-manager 命名空间声明?过滤器、入口点和身份验证管理器 bean 仍然是多余的,只是令人困惑。

以上是关于Spring Security 中的 LDAP + HttpBasicAuth 问题的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security Ldap Authentication Filter 中的大括号如何工作?

Spring Security Ldap,只登录指定组中的用户

登录表单用户凭据而不是 LDAP Spring Security 中的硬编码 UserDn 和密码

未分配 Grails Spring Security LDAP“defaultRole”

如何使用 JOSSO 和 Spring Security 从 Grails 应用程序中的 LDAP 获取自定义属性?

Spring Security Ldap验证userDn和登录表单中的密码