我是Spring Security的新手,在学习时,我知道Spring Security在内部是一组过滤器。在这里,我有点困惑,默认情况下,HandlerInterceptor
,用户定义的过滤器和安全性过滤器以什么顺序执行?
我曾尝试搜索互联网,但所有人都在谈论这些过滤器之间的差异。
[Spring-Security-Filters
,User-defined-Filters
,HandlerInterceptor
让我用其他方式输入这3个
过滤器: Spring-Security-Filters
和User-defined-Filters
DispatherServlet之后的机制:HandlerInterceptor
(如下图所示)
由于HandlerInterceptor
在DispatcherServlet
之后,由于过滤器总是在到达servlet之前进行处理我可以肯定地说出[[HandlerInterceptor
到最后]]。Spring-Security-Filters
与User-defined-Filters
的现在顺序如果您使用传统的spring-mvc(不是spring boot),则可以使用基于xml或java的配置。您可以为用户定义的过滤器实现任何顺序。您可以在spring security(springSecurityFilterChain)之后或以下放置。
<filter>
<filter-name>sessionLastAccessTimeUpdateFilter</filter-name>
<filter-class>com.pvn.mvctiles.configuration.SessionLastAccessTimeUpdateFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>sessionLastAccessTimeUpdateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
在上面的示例中,sessionLastAccessTimeUpdateFilter的顺序是在springSecurityFilterChain sessionLastAccessTimeUpdateFilter首先执行之前。您可以根据需要更改订单。等效的Java配置如下所示。
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer
{
@Override
public void onStartup(ServletContext servletContext) throws ServletException
{
super.onStartup(servletContext);
servletContext.addFilter("sessionLastAccessTimeUpdateFilter", new SessionLastAccessTimeUpdateFilter())
.addMappingForUrlPatterns(null, true, "/*");
servletContext.addFilter("springSecurityFilterChain", new DelegatingFilterProxy("springSecurityFilterChain"))
.addMappingForUrlPatterns(null, true, "/*");
}
}
但是与传统的弹簧方法相比,弹簧靴有所不同,并且受到很多限制。 Spring Boot不支持web.xml,仅通过FilterRegistrationBean
允许过滤器注册,但是这里注册的过滤器在FilterChainProxy
之后。
但是Spring Security提供了通过.addFilterBefore()
and .addFilterAfter()
在Spring安全过滤器之间添加过滤器的规定
请注意,Spring Security具有许多代理过滤器或Spring托管Bean,这些过滤器具有特定的顺序。如果您通过为.addFilterBefore()
创建子类来实现过滤器,则该自定义过滤器顺序将与为.addFilterAfter()
最后,HandlerInterceptor机制排在最后,但是spring安全过滤器和用户定义的过滤器可以以任何顺序出现,并且取决于您的配置。
要大致了解这些过滤器的执行,可以参考UsernamePasswordAuthenticationFilter
UsernamePasswordAuthenticationFilter
)应首先执行,因为它的存在是为了保护所有URL访问,因此在执行其他过滤器之前应首先执行以确保请求具有足够的权限是有道理的。] >my answer不是Servlet FilterChainProxy
,而是Spring MVC的功能之一。认为这只是Spring MVC Servlet(即HandlerInterceptor
)中的一些代码。作为Filter
,这意味着如果定义了任何其他用户定义的过滤器
((我假设用户定义的过滤器是正常在DispatcherServlet
中注册的Servlet Filter
is executed before Servlet
或等效的对象]