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


猜你喜欢
- jstack - Prints Java thread stack traces for a Java process, core file
- 1.memchrmemchr的函数声明:void *memchr(const void *str, int c, size_t n);作用:
- 目录一、什么是RPC?二、实现RPC需要解决那些问题?1. 约定通信协议格式2. 序列化方式3. TCP粘包、拆包4. 网络通信框架的选择三
- 前言在开发中常要处理横竖屏切换,怎么处理先看生命周期申明Activity 横竖屏切换时需要回调两个函数 ,所以在此将这个两个函数暂时看成是A
- 这篇文章主要介绍了Spring使用@Autowired为抽象父类注入依赖代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一
- Android AlertDialog自定义样式像列表这种选择项的弹出式对话框,要改变样式一般都采取重写layout方式今天才了解到 其实可
- 1.固定大小的线程池简介线程池就是在程序启动的时候先建立几个可以使用的线程放在那里,然后等着具体的任务放进去,这个任务基本可以说都是Runn
- Java for循环标签跳转到指定位置大家是否见过这种for循环,在for循环前加了个标记的:outerLoop:for (; ; ) {
- 本文通过两个方法:(1)计算总的页数。 (2)查询指定页数据,实现简单的分页效果。思路:首先得在 DAO 对象中提供分页查询的方法,在控制层
- 简介Spring Security是一个基于Spring框架的安全认证和授权框架,它提供了一套全面的安全解决方案,可以在Web应用、移动应用
- 前言本文我们主要实战Mybatis官方的代码生成器:Mybatis Generator(MBG),掌握它以后,可以简化大部分手写代码,我们只
- /** * 日期工具类 * 默认使用 "yyyy-MM-dd HH:mm:ss" 格式化日期&nbs
- 本文实例讲述了Java Swing实现让窗体居中显示的方法。分享给大家供大家参考,具体如下:Swing组件是AWT组建的增强组件,是功能强大
- 一、MyBatis背景介绍MyBatis是支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码
- 一、CAS(Compare And Set)Compare And Set(或Compare And Swap),CAS是解决多线程并行情况
- 前言Android Studio是Google开发的一款面向Android开发者的IDE,支持Windows、Mac、Linux等操作系统,
- 邮件发送 方法一:使用System.Web.Mail命名空间(此方法我测试没有成功过) #region 发送邮件:此方法失败 pr
- 方法一:1.在pom.xml文件下添加依赖包<dependency><groupId>com.alibaba<
- 具体代码如下所示:import java.util.ArrayList;import java.util.List;import java.
- Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和