Spring security Spring安全性-如何提及基于表单和基本身份验证

Spring security Spring安全性-如何提及基于表单和基本身份验证,spring-security,Spring Security,在SpringSecurity中,是否可以使用名称空间配置同时提及基于表单的身份验证和基本身份验证,而不重写其他身份验证?因此,应用程序可以同时为基于浏览器的请求和远程客户端提供服务。似乎不可能使用名称空间配置同时声明表单和基本身份验证 spring社区的参考链接: 您想要的最终结果是可能的,我遇到了完全相同的问题,下面是我的解决方案 在命名空间中定义表单登录时,它将自动覆盖通过命名空间应用的任何其他身份验证筛选器。这是通过过滤器链的排序来完成的。请查看spring security中的filt

在SpringSecurity中,是否可以使用名称空间配置同时提及基于表单的身份验证和基本身份验证,而不重写其他身份验证?因此,应用程序可以同时为基于浏览器的请求和远程客户端提供服务。

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

spring社区的参考链接:
您想要的最终结果是可能的,我遇到了完全相同的问题,下面是我的解决方案

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

为了避免这种情况,请从名称空间中删除http basic标记,然后手动定义bean以处理基本身份验证,并将其顺序放在AuthenticationProcessingFilter之前,因为这是将处理表单登录的spring安全筛选器

BasicProcessingFilter spring提供的用于处理基本身份验证的筛选器是被动筛选器,这意味着如果凭据丢失,它将继续沿着筛选器链向下运行,直到找到适当的筛选器来处理请求

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


还要注意,如果找不到authenticationManager引用,可以向命名空间添加别名,如下所示

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

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

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

然而,在SpringSecurity的3.1版中,spring似乎可以解决这个问题,不再需要这种解决方法

答案是正确的。但是,如果您使用的是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>


... 你的截取网址在这里
....

我不知道将过滤器放在
安全性\u上下文\u过滤器之前是否是最佳选择。

现在可以使用Spring SECURITY 3.1.0

他们添加了添加多个过滤器的可能性,这是正确的,这里有一个链接将扩展这个答案:我认为目标是让RESTAPI支持同一领域内的两种身份验证。定义两个领域就像定义两场战争——虽然有效,但并不理想。
<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>