2010-11-10 64 views
1

我使用Spring Security 3.0.3.RELEASE。我想创建一个自定义验证处理过滤器。春季安全3.0.3和自定义的认证处理过滤器

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

// 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.doFiltermyFilter.attemptAuthentication

任何想法为什么?

回答

3

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

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

AbstractAuthenticationProcessingFilter.doFilter()又是负责调用MyFilter.attemptAuthentication()

如果不是的话,也许你MyFilter推翻doFilter()?如果是的话,更好的去除(或至少致电super.doFilter())。有关更多详细信息,请参见AbstractAuthenticationProcessingFilter的JavaDocs。

编辑:MinimeDJ澄清,一切都如我上面的建议。在这种情况下,我建议检查filterProcessesUrl财产的价值。从JavaDocs

此过滤器将拦截的请求,并且尝试从该请求 执行认证,如果请求URL的filterProcessesUrl属性的值匹配。通过重写方法requireAuthentication可以修改此行为。

,因此您可以:

  • 或者设置适当的filterProcessesUrl值(通常像/j_spring_security_check
  • 或者你可以重写requiresAuthentication方法总是返回true

如果您仍然有问题,那么我建议你把一个调试器,并通过弹簧安全(和你)单步执行代码,看看究竟在何处的问题时。

+0

嗨Neeme,它是MyFilter。代码中的所有内容都按照您的建议,但不知何故,不会调用attemptAuthentication ...还有其他方法可以检查吗? – Worker 2010-11-10 16:44:59

+0

在回复中增加了一些建议 – 2010-11-10 17:15:33

+0

好的,我设法使everythinf工作。我不得不通过bean配置删除标准的 config和config spring security。谢谢! – Worker 2010-11-11 09:27:39