Spring Security过滤器链体系
2022-02-10 13:53
701 查看
以下摘自胖哥分享的 2022开工福利教程。
在学习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的功能。
DelegatingFilterProxy
Servlet 容器和Spring IoC容器之间的Filter生命周期并不匹配。为了让Spring IoC容器管理Filter的生命周期,
FilterChainProxy便交由Spring Web下的
DelegatingFilterProxy来代理。而且
FilterChainProxy不会在添加到应用程序上下文的任何过滤器Bean上调用标准Servlet过滤器生命周期方法,
FilterChainProxy的生命周期方法会委托给
DelegatingFilterProxy来执行。而
DelegatingFilterProxy作为Spring IoC和Servlet的连接器存在。
简单总结
上面的三个概念非常重要,涉及到Spring Security的整个过滤器链体系。但是作为初学者来说,能看懂多少就看懂多少,不要纠结哪些没有理解,因为目前学习阶段的层次达不到是非常正常的。但是等你学完了Spring Security之后,这几个概念一定要搞明白。
关注公众号:Felordcn 获取更多资讯
相关文章推荐
- 管道—过滤器简介 软件体系结构
- spring security 中spring bean组成的过滤器链如何初始化的
- 【Spring实战】----源码解析Spring Security4.1.3中的过滤器Filter配置
- Spring web过滤器-委派过滤器代理(DelegatingFilterProxy/FilterChainProxy)——Spring Security3源码分析
- spring security 2中使用通过自定义过滤器实现多登录页面
- Spring Security常用过滤器实例解析
- 【Spring Security】五、自定义过滤器
- Spring Security 学习笔记-信道过滤器
- Spring Security原理学习--核心过滤器Filter
- Spring Security --- 内置过滤器表
- Spring Security中代理过滤器是通过FilterChain如何工作的
- spring security 11种过滤器介绍
- Spring Security入门(2-1)Spring Security - 重要的过滤器
- Spring Security--核心过滤器源码分析
- Spring Security 竟然可以同时存在多个过滤器链?
- spring security 11种过滤器介绍
- 【Spring Security】六、自定义认证处理的过滤器
- Spring Security配置个过滤器也这么卷
- Spring Security 学习笔记-登录认证过滤器
- Spring Security 核心过滤器链分析