我们一起学习 Spring Security过滤器链体系

开发 架构
不管用户是哪种角色,都走的是一个过滤器链,一个应用中存在1-n个SecurityFilterChain。那谁来管理多个SecurityFilterChain呢?

在学习Spring Security的时候你有没有下面这两个疑问:

  • Spring Security的登录是怎么配置的?
  • Spring Security的访问控制是什么机制?

SpringBootWebSecurityConfiguration

上面两个疑问的答案就在配置类SpringBootWebSecurityConfiguration中。你可以按照下面这个思维导图去理解这个自动配置:

SpringBootWebSecurityConfiguration为Spring Boot应用提供了一套默认的Spring Security配置。

 @Bean
@Order(SecurityProperties.BASIC_AUTH_ORDER)
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
return http.build();
}

这里的配置为:所有的请求都必须是认证用户发起的,同时开启表单登录功能以及Http Basic Authentication认证功能。我们访问/foo/bar时需要登录认证并且能够进行表单登录就是这个配置起作用了。这个是我们日常开发需要自定义的,在HttpSecurity相关的文章中胖哥也进行了讲解。这个SecurityFilterChain到底是什么呢?

SecurityFilterChain

从上面看得出HttpSecurity就是一个构建类,它的使命就是构建出一个SecurityFilterChain:

public interface SecurityFilterChain {
// 当前请求是否匹配
boolean matches(HttpServletRequest request);
// 一揽子过滤器组成的有序过滤器链
List<Filter> getFilters();
}

当一个请求HttpServletRequest进入SecurityFilterChain时,会通过matches方法来确定是否满足条件进入过滤器链。就好比你是VIP走的是VIP通道,享受的是VIP的一系列待遇;你是普通用户,就走普通用户的通道并享受普通用户的待遇。

不管用户是哪种角色,都走的是一个过滤器链,一个应用中存在1-n个SecurityFilterChain。那谁来管理多个SecurityFilterChain呢?

记住这个公式HttpSecurity ->SecurityFilterChain。

FilterChainProxy

FilterChainProxy是一个GenericFilterBean(即使Servlet Filter又是Spring Bean),它管理了所有注入Spring IoC容器的SecurityFilterChain。在我刚接触Spring Security的时候是这样配置FilterChainProxy的:

    <bean id="myfilterChainProxy" class="org.springframework.security.web.FilterChainProxy">
<constructor-arg>
<util:list>
<security:filter-chain pattern="/do/not/filter*" filters="none"/>
<security:filter-chain pattern="/**" filters="filter1,filter2,filter3"/>
</util:list>
</constructor-arg>
</bean>

根据不同的请求路径匹配走不同的SecurityFilterChain。下面是示意图:

后面还会对遇到这个类,现在你只需要明白上面这个图就行了。

请注意:在同一过滤器链中不建议有多个FilterChainProxy实例,而且不应将其作为单纯的过滤器使用,它只应该承担管理SecurityFilterChain的功能。

DelegatingFilterProxyS

ervlet 容器和Spring IoC容器之间的Filter生命周期并不匹配。为了让Spring IoC容器管理Filter的生命周期,FilterChainProxy便交由Spring Web下的DelegatingFilterProxy来代理。而且FilterChainProxy不会在添加到应用程序上下文的任何过滤器Bean上调用标准Servlet过滤器生命周期方法,FilterChainProxy的生命周期方法会委托给DelegatingFilterProxy来执行。而DelegatingFilterProxy作为Spring IoC和Servlet的连接器存在。

简单总结

上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。


责任编辑:武晓燕 来源: 码农小胖哥
相关推荐

2022-02-14 07:32:13

Spring过滤器链Matcher

2022-02-16 23:58:41

Spring过滤器验证码

2022-02-21 23:58:49

Spring过滤器顺序值

2023-01-26 01:41:27

核心全局过滤器

2021-11-11 07:38:15

服务器过滤器框架

2024-01-08 08:33:53

AOPSpring拦截器

2022-02-14 10:16:22

Axios接口HTTP

2021-05-19 10:37:16

WebFlux 前置工具

2022-11-03 07:51:54

运维体系监控

2017-04-12 14:43:01

Spring ClouZuul过滤器

2021-07-05 15:22:03

Servlet过滤器客户端

2021-11-26 09:44:42

链表节点定位

2022-12-01 09:59:57

内核观测性方法

2021-05-20 07:15:34

RSA-PSS算法签名

2021-10-27 07:15:37

SpringAOP编程(

2024-01-05 09:04:35

隆过滤器数据结构哈希函数

2023-03-28 07:32:37

2023-03-26 12:45:52

Linux内核头文件

2017-05-04 22:30:17

Zuul过滤器微服务

2021-01-14 08:13:39

Spring Clou应用内置过滤器
点赞
收藏

51CTO技术栈公众号