Spring Security中的Servlet过滤器体系代码分析
作者:码农小胖哥 发布时间:2023-03-23 19:05:34
1. 前言
我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行了罗列,但是Spring Security真正的过滤器体系才是我们了解它是如何进行"认证"、“授权”、“防止利用漏洞”的关键。
2. Servlet Filter体系
这里我们以Servlet Web为讨论目标,Reactive Web暂不讨论。我们先来看下最基础的Servlet体系,在Servlet体系中客户端发起一个请求过程是经过0到N个Filter
然后交给Servlet
处理。
Filter
不但可以修改HttpServletRequest
和HttpServletResponse
,可以让我们在请求响应的前后做一些事情,甚至可以终止过滤器链FilterChain
的传递。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 请求被servlet 处理前
if(condition){
// 根据条件来进入下一个过滤器
chain.doFilter(request, response);
}
// 请求被执行完毕后处理一些事情
}
由于Filter
仅影响下游Filters和Servlet,因此每个Filter
调用的顺序非常重要。Spring Security正是根据这个个特性来实现一系列的安全功能。接下来我们来看看它们是如何结合的。
3. GenericFilterBean
在该系列的文章开篇我对Spring Security和Shiro进行了简单的对比。Spring Security利用了Spring IOC和AOP的特性而无法脱离Spring独立存在,而Apache Shiro可以独立存在。所以今天我们要一探究竟,看看他们是如何结合的。
Spring结合Servlet Filter自然是要为Servlet Filter注入Spring Bean的特性,所以就搞出了一个抽象Filter Bean,这个抽象过滤器GenericFilterBean
并不是在Spring Security下,而是Spring Web体系中,类图如下:
从类图上看Filter
接口已经被注入了多个Spring Bean的特性,纳入了Spring Bean生命周期,使得Spring IoC容器能够充分的管理Filter
。
4. DelegatingFilterProxy
我们希望Servlet能够按照它自己的标准来注册到过滤器链中工作,但是同时也希望它能够被Spring IoC管理,所以Spring提供了一个GenericFilterBean
的实现DelegatingFilterProxy
。我们可以将原生的Servlet Filter或者Spring Bean Filter委托给DelegatingFilterProxy
,然后在结合到Servlet FilterChain中。
5. SecurityFilterChain
针对不同符合Ant Pattern的请求可能会走不同的过滤器链,比如登录会去验证,然后返回登录结果;管理后台的接口走后台的安全逻辑,应用客户端的接口走客户端的安全逻辑。Spring Security提供了一个SecurityFilterChain
接口来满足被匹配HttpServletRequest
走特定的过滤器链的需求。
public interface SecurityFilterChain {
// 判断请求 是否符合该过滤器链的要求
boolean matches(HttpServletRequest request);
// 对应的过滤器链
List<Filter> getFilters();
}
6. FilterChainProxy
不同的SecurityFilterChain
应该是互斥而且平等的,它们之间不应该是上下游关系。
如上图请求被匹配到不同的SecurityFilterChain
然后在执行剩余的过滤器链。它们经过SecurityFilterChain
的总流程是相似的,而且有些时候特定的一些SecurityFilterChain
也需要被集中管理来实现特定一揽子的请求的过滤逻辑。所以就有了另外一个GenericFilterBean
实现来做这个事情,它就是FilterChainProxy
。它的作用就是拦截符合条件的请求,然后根据请求筛选出符合要求的SecurityFilterChain
,然后链式的执行这些Filter,最后继续执行剩下的FilterChain
。
扩展阅读:Spring Security 过滤器链
7. 总结
结合上面,最终上述这些概念的关系彻底搞清楚了,搞清楚过滤器的运作模式对于学习和使用Spring Security至关重要。
来源:https://www.cnblogs.com/felordcn/archive/2020/07/06/13253833.html
猜你喜欢
- Android Support Annotations &
- 1.application.ymlserver: port: 8184spring: application: &n
- 前提最近发现各个频道推荐了很多ULID相关文章,这里对ULID的规范文件进行解读,并且基于Java语言自行实现ULID,通过此实现过程展示U
- 本文实例讲述了java在网页上面抓取邮件地址的方法。分享给大家供大家参考。具体实现方法如下:import java.io.BufferedR
- 学过Spring的小伙伴对于IOC一定不陌生,IOC:控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向
- 前言众所周知,Struts2是个非常优秀的开源框架,我们能用Struts2框架进行开发,同时能快速搭建好一个Struts2框架,但我们是否能
- 一个Resty项目包含的部分(resty-route):1. RestFilter像其他web框架一样,Resty也需要一个入口,在web.
- 这篇文章主要介绍了基于SPRINGBOOT配置文件占位符过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 一、泛型集合List<T>排序经sort方法之后,采用了升序的方式进行排列的。 List<int> list = n
- 主要是重写attemptAuthentication方法导入依赖<dependency><groupId>org.s
- Java线程分为两类分别为daemon线程(守护线程)和User线程(用户线程),在JVM启动时候会调用main函数,main函数所在的线程
- public static String getCharset(File file) { &n
- AnDroidDraw 是一个与 DroidDraw 集成的 Android 应用程序,它允许你从 DroidDraw 应用 程序下载你的
- import java.io.BufferedInputStream;import java.io.BufferedOutputStream
- 先来一个常见的错误信息:Due to limitations of the com.mongodb.BasicDocument, you c
- AES简介AES(The Advanced Encryption Standard)是美国国家标准与技术研究所用于加密电子数据的规范。它被预
- 一、Springboot项目运行正常打包前,Springbooot项目在本地必须是运行正常的。我们这里使用本专栏写起来的项目,如下所示:来访
- 本文实例讲述了C#获取真实IP地址实现方法,分享给大家供大家参考。具体实现方法如下:通常来说,大家获取用户IP地址常用的方法是:string
- 在java项目开发中。最开始换行符大家一般是在idea中设置新文件为LF,并且对旧文件通过IDEA下方的点击来更换换行符。很显然,对于几千文
- 定时器问题定时器属于基本的基础组件,不管是用户空间的程序开发,还是内核空间的程序开发,很多时候都需要有定时器作为基础组件的支持。一个定时器的