在一个使用了Spring Security 的 Web 应用中,安全目标的达成基于 Servlet规范的Filter机制 :
- 客户端对应用发起请求,容器基于请求
URI决定应用哪个servlet和哪些filters; - 每个请求最多由某一个
servlet处理 ; - 所有要应用的
filter按照特定顺序形成一个链;Filter顺序的决定Filterbean定义通过使用注解@Order或者实现接口Ordered;FilterRegistrationBeanAPI 本身有顺序属性;
- 链中的某个
filter如果想自己处理请求,甚至可以否决链的其他部分; - 某个
filter可以修改请求/响应对象;
从Web容器角度,整个Spring Security安全机制是封装为一个Filter存在的,而不是多个Filter
- 该安全
filter的实现类为FilterChainProxy; - 该安全
filter是一个以bean的形式缺省被安装; - 从
Web容器角度看,FilterChainProxy是一个filter,但其内部是一个filter chain,有多个filter; - 实际上在
FilterChainProxy之上还有一层DelegatingFilterProxyDelegatingFilterProxy不一定是一个bean,FilterChainProxy总是一个bean;DelegatingFilterProxy把实际工作交给FilterChainProxy来做;
FilterChainProxy的名字总是叫做springSecurityFilterChain;FilterChainProxy包含了所有的安全逻辑,内部组织为一个filter chain;- 所有这些内部的安全
filter也都实现了Servlet规范中标准的Filter接口;
- 所有这些内部的安全
FilterChainProxy可以管理多个filter chain,这些对容器是透明的;FilterChainProxy发请求派发给第一个匹配的filter chain来处理;
一个使用了Spring Security的Spring Boot Web应用,其FilterChainProxy filter中通常会有包含若干个filter chain,这里我们假定有n个 :
- 前
n-1个filter chain通常用来忽略静态资源,比如分别对应/css/**,/images/**,error view/error等; - 最后一个用来匹配
/**,其中包含了认证,授权,异常处理,会话处理,头部写入等等主要安全逻辑。- 缺省情况下这个
filter chain包含多个filter,一般情况下用户不需要关注它们是什么,什么时候用。
- 缺省情况下这个
Spring Boot Web应用中,FilterChainProxy bean由安全配置类WebSecurityConfiguration创建 :
- 整个应用对应一个
WebSecurity实例,代表整个应用所有的Web安全配置; WebSecurity实例 对应多个WebSecurityConfigurer实例 ;- 每个
WebSecurityConfigurer实例对应一个HttpSecurity实例;
- 每个
WebSecurityConfiguration使用上面的WebSecurity创建bean FilterChainProxy springSecurityFilterChain;WebSecurity::build()创建并返回了类型为FilterChainProxy对象;- 每个
WebSecurityConfigurer实例对应生成FilterChainProxy中的一个filter chain; - 每个
web.ignoring().antMatchers()调用对应生成FilterChainProxy中的一个filter chain;

本文详细介绍了Spring Security中Filter机制的工作原理,包括Filter的注册、排序及FilterChainProxy的内部结构。阐述了如何通过FilterChainProxy管理多个Filter链,并解释了DelegatingFilterProxy与FilterChainProxy之间的关系。
336

被折叠的 条评论
为什么被折叠?



