在Spring-boot中,它将首先在HandlerInterceptor,用户定义的过滤器和spring-security过滤器中执行?

问题描述 投票:0回答:2

我是Spring Security的新手,在学习时,我知道Spring Security在内部是一组过滤器。在这里,我有点困惑,默认情况下,HandlerInterceptor,用户定义的过滤器和安全性过滤器以什么顺序执行?

我曾尝试搜索互联网,但所有人都在谈论这些过滤器之间的差异。

java spring spring-boot spring-mvc spring-security
2个回答
0
投票

[Spring-Security-FiltersUser-defined-FiltersHandlerInterceptor让我用其他方式输入这3个

过滤器: Spring-Security-FiltersUser-defined-FiltersDispatherServlet之后的机制:HandlerInterceptor(如下图所示)enter image description here

由于HandlerInterceptorDispatcherServlet之后,由于过滤器总是在到达servlet之前进行处理我可以肯定地说出[[HandlerInterceptor到最后]]。Spring-Security-FiltersUser-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


-1
投票
Spring Security过滤器(即UsernamePasswordAuthenticationFilter)应首先执行,因为它的存在是为了保护所有URL访问,因此在执行其他过滤器之前应首先执行以确保请求具有足够的权限是有道理的。] >

my answer不是Servlet FilterChainProxy,而是Spring MVC的功能之一。认为这只是Spring MVC Servlet(即HandlerInterceptor)中的一些代码。作为Filter,这意味着如果定义了任何其他用户定义的过滤器

((我假设用户定义的过滤器是正常在DispatcherServlet中注册的Servlet Filter is executed before Servlet或等效的对象]

© www.soinside.com 2019 - 2024. All rights reserved.