我使用的是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
的页面时。有什么想法吗?
最佳答案
当然,servlet容器调用MyFilter.doFilter
-毕竟,这是过滤器中的entry point。
在您的特定情况下,该servlet容器应该在AbstractAuthenticationProcessingFilter而不是doFilter()
上调用MyFilter
。AbstractAuthenticationProcessingFilter.doFilter()
依次负责调用MyFilter.attemptAuthentication()
。
如果不是这种情况,也许您覆盖了doFilter()
中的MyFilter
?如果是,最好将其删除(或至少调用super.doFilter()
)。有关更多详细信息,请参见AbstractAuthenticationProcessingFilter的JavaDocs。
编辑:MinimeDJ澄清了一切,正如我在上面建议的那样。在这种情况下,我建议检查filterProcessesUrl
属性的值。从JavaDocs:
如果请求URL与filterProcessesUrl属性的值匹配,则此筛选器将拦截请求并尝试从该请求执行身份验证。可以通过重写requireAuthentication方法来修改此行为。
这样你就可以:
要么设置适当的filterProcessesUrl
值(通常类似于/j_spring_security_check
)
或者您可以重写requiresAuthentication
方法以始终返回true
。
如果您仍然遇到问题,那么我建议您使用调试器并逐步检查spring-security(和您的)代码,以查看问题出在哪里。