Spring Security 3.0.3和自定义身份验证处理过滤器

时间:2010-11-10 16:08:52

标签: java spring java-ee spring-security

我使用Spring Security 3.0.3.RELEASE。我想创建一个自定义身份验证处理过滤器。

我创建了一个这样的过滤器:

// imports ommited
public class myFilter extends AbstractAuthenticationProcessingFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException, IOException, ServletException {
        // some code here
    }
}

我按以下方式配置security.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns:beans="http://www.springframework.org/schema/beans"
         xsi:schemaLocation="
         http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/security
         http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <http auto-config="true">
        <!--<session-management session-fixation-protection="none"/>-->
        <custom-filter ref="ipFilter" before="FORM_LOGIN_FILTER"/>
        <intercept-url pattern="/login.jsp*" filters="none"/>
        <intercept-url pattern="/**" access="ROLE_USER"/>
        <form-login login-page="/login.jsp" always-use-default-target="true"/>
        <logout logout-url="/logout" logout-success-url="/login.jsp" invalidate-session="true"/>
    </http>

    <beans:bean id="ipFilter" class="myFilter">
        <beans:property name="authenticationManager" ref="authenticationManager"/>
    </beans:bean>

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

一切似乎都是正确的,但是当我尝试访问被myFilter.attemptAuthentication myFilter.doFilter {}}}的受保护网页时。

任何想法为什么?

1 个答案:

答案 0 :(得分:3)

当然,servlet容器调用MyFilter.doFilter - 毕竟这是过滤器中的entry point

在您的特定情况下,servlet容器应该在AbstractAuthenticationProcessingFilter上调用doFilter(),而不是MyFilter

AbstractAuthenticationProcessingFilter.doFilter()反过来负责调用MyFilter.attemptAuthentication()

如果情况并非如此,可能你在doFilter()中覆盖 MyFilter?如果是,最好删除(或至少调用super.doFilter())。有关详细信息,请参阅AbstractAuthenticationProcessingFilter的JavaDocs。

编辑:MinimeDJ澄清说,一切都如我上面所建议的那样。在这种情况下,我建议检查filterProcessesUrl属性的值。来自JavaDocs

此过滤器将拦截请求并尝试从该请求执行身份验证如果请求URL与filterProcessesUrl属性的值匹配。可以通过覆盖方法requiresAuthentication来修改此行为。

所以你可以:

  • 设置相应的filterProcessesUrl值(通常类似于/j_spring_security_check
  • 或者您可以覆盖requiresAuthentication方法以始终返回true

如果您仍然遇到问题,我建议您使用调试器并逐步执行spring-security(和您的)代码,以查看问题的确切位置。