13

是否可以使用命名空间配置在 Spring 安全性中同时提及基于表单的身份验证和基本身份验证而不覆盖其他身份验证?这样应用程序就可以同时为基于浏览器的请求和远程客户端提供服务。

4

4 回答 4

10

@grimesjm的回应是正确的。但是,如果您使用的是 Spring 3.x,则必须将类名调整为:

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

<bean id="authenticationEntryPoint"
    class="org.springframework.security.web.authentication.www.BasicAuthenticationEntryPoint">
    <property name="realmName" value="Your realm here" />
</bean>

<sec:http auto-config="true">
    ... your intercept-url here

    <sec:custom-filter before="SECURITY_CONTEXT_FILTER" ref="basicProcessingFilter" />

    <sec:form-login ... />
    ....
</sec:http>

我不知道将过滤器放在前面SECURITY_CONTEXT_FILTER是否是最佳选择。

于 2010-04-29T18:39:09.400 回答
6

您想要的最终结果是可能的,我遇到了完全相同的问题,这是我的解决方案。

任何时候在命名空间中定义表单登录时,它都会自动覆盖您通过命名空间应用的任何其他身份验证过滤器。这是通过过滤器链的排序来完成的,查看 spring security 中的 FilterChainOrder.java 以了解该顺序是如何实际应用于每个过滤器的。

为了解决这个问题,请从命名空间中删除 http-basic 标记,然后手动定义 bean 以处理基本身份验证并将其顺序放在 AuthenticationProcessingFilter 之前,因为这是处理表单登录的 spring 安全过滤器。

用于处理基本身份验证的 BasicProcessingFilter spring 是一个被动过滤器,这意味着如果缺少凭据,它将继续沿着过滤器链向下运行,直到找到合适的过滤器来处理请求。

现在通过手动定义 BasicProcessingFilter bean,我们可以设置它出现在过滤器链中的顺序。下面是您需要在安全 xml 中提供的附加 xml 声明的示例(Spring Security < 3.x)

<bean id="basicProcessingFilter" class="org.springframework.security.ui.basicauth.BasicProcessingFilter">
    <property name="authenticationManager"><ref bean="authenticationManager"/></property>
     <security:custom-filter before="AUTHENTICATION_PROCESSING_FILTER"/>
    <property name="authenticationEntryPoint"><ref bean="authenticationEntryPoint"/></property>
</bean>

<bean id="authenticationEntryPoint"
    class="org.springframework.security.ui.basicauth.BasicProcessingFilterEntryPoint">
              <property name="realmName" value="My Realm Here"/>
</bean>

另请注意,如果未找到您的 authenticationManager 参考,您可以为您的命名空间添加一个别名,如下所示。

<security:authentication-manager alias="authenticationManager"/>

最终结果是基本过滤器将作为被动过滤器应用,如果缺少所需的凭据,它将继续沿着过滤器链向下,然后表单登录过滤器将处理它。

这种方法的问题在于,如果正确输入了凭据,则返回的响应是来自表单登录过滤器的登录页面。

但是,似乎这个问题将在 spring security 3.1 版中由 spring 解决,并且不再需要这种解决方法。

于 2009-11-06T19:45:54.163 回答
1

现在可以使用 Spring Security 3.1.0

于 2010-12-14T18:03:43.870 回答
0

似乎不可能使用命名空间配置同时声明表单和基本身份验证。

spring社区的参考链接:http: //forum.springsource.org/showthread.php?t=72724 &highlight=form+basic+authentication

于 2009-08-20T09:38:45.617 回答