问题是我的自定义Spring Security过滤器从未在请求进入时调用。在调试过程中,我发现在doFilter()
FilterChainProxy
中,我的过滤器(JwtAuthenticationFilter
)可以被抓取:
但它被跳过了。然后我发现它是由于:
因此我的文件管理器的超类AbstractAuthenticationProcessingFilter
认为该请求不需要身份验证,只需调用doFilter()
即可将其传递下去。我认为我的配置指出需要auth。此特定请求为/ui/home/index.jsp
,其中\ui
为上下文。
我的安全配置:
<http use-expressions="true" pattern="/**" entry-point-ref="JwtAuthenticationEntryPoint" create-session="stateless">
<custom-filter before="CONCURRENT_SESSION_FILTER" ref="jwtAuthenticationFilter" />
<intercept-url pattern="/home/**" access="isAuthenticated()"/>
// some other intercept-url definitions
</http>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="authenticationProvider"/>
</authentication-manager>
和bean配置:
<bean id="jwtAuthenticationFilter" class="com.pk.jjwt.JwtAuthenticationTokenFilter" >
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationSuccessHandler" ref="jwtAuthenticationSuccessHandler" />
</bean>
<bean id="JwtAuthenticationEntryPoint" class="com.pk.jjwt.JwtAuthenticationEntryPoint" />
<bean id="authenticationProvider" class="com.pk.jjwt.JwtAuthenticationProvider" />
<bean id="jwtAuthenticationSuccessHandler" class="com.pk.jjwt.JwtAuthenticationSuccessHandler" />
我想知道什么可能导致过滤器被跳过?我想我指定每个url模式都需要进行身份验证。我不确定为什么它认为请求不需要我的自定义过滤器进行身份验证。
修改
所以我调试了requiresAuthentication()
方法,并找到了:
基本上,它评估uri.endsWith("/ui/**")
和uri
是/ui/home/index.jsp
。它返回false,因此会跳过过滤器。