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处理。

Spring Security中的Servlet过滤器体系代码分析

Filter不但可以修改HttpServletRequestHttpServletResponse,可以让我们在请求响应的前后做一些事情,甚至可以终止过滤器链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体系中,类图如下:

Spring Security中的Servlet过滤器体系代码分析

从类图上看Filter接口已经被注入了多个Spring Bean的特性,纳入了Spring Bean生命周期,使得Spring IoC容器能够充分的管理Filter

4. DelegatingFilterProxy

我们希望Servlet能够按照它自己的标准来注册到过滤器链中工作,但是同时也希望它能够被Spring IoC管理,所以Spring提供了一个GenericFilterBean的实现DelegatingFilterProxy。我们可以将原生的Servlet Filter或者Spring Bean Filter委托给DelegatingFilterProxy,然后在结合到Servlet FilterChain中。

Spring Security中的Servlet过滤器体系代码分析

5. SecurityFilterChain

针对不同符合Ant Pattern的请求可能会走不同的过滤器链,比如登录会去验证,然后返回登录结果;管理后台的接口走后台的安全逻辑,应用客户端的接口走客户端的安全逻辑。Spring Security提供了一个SecurityFilterChain接口来满足被匹配HttpServletRequest走特定的过滤器链的需求。


public interface SecurityFilterChain {
// 判断请求 是否符合该过滤器链的要求
boolean matches(HttpServletRequest request);
// 对应的过滤器链
List<Filter> getFilters();
}

Spring Security中的Servlet过滤器体系代码分析

6. FilterChainProxy

不同的SecurityFilterChain应该是互斥而且平等的,它们之间不应该是上下游关系。

Spring Security中的Servlet过滤器体系代码分析

如上图请求被匹配到不同的SecurityFilterChain然后在执行剩余的过滤器链。它们经过SecurityFilterChain的总流程是相似的,而且有些时候特定的一些SecurityFilterChain也需要被集中管理来实现特定一揽子的请求的过滤逻辑。所以就有了另外一个GenericFilterBean实现来做这个事情,它就是FilterChainProxy。它的作用就是拦截符合条件的请求,然后根据请求筛选出符合要求的SecurityFilterChain,然后链式的执行这些Filter,最后继续执行剩下的FilterChain

扩展阅读:Spring Security 过滤器链

7. 总结

结合上面,最终上述这些概念的关系彻底搞清楚了,搞清楚过滤器的运作模式对于学习和使用Spring Security至关重要。

Spring Security中的Servlet过滤器体系代码分析

来源:https://www.cnblogs.com/felordcn/archive/2020/07/06/13253833.html

标签:Spring,Security,Servlet,过滤器体系
0
投稿

猜你喜欢

  • 带你了解Spring中bean的获取

    2021-10-10 09:53:10
  • SpringBoot中配置Web静态资源路径的方法

    2023-10-26 03:49:21
  • Android 显示GIF图片实例详解

    2023-08-06 09:11:52
  • 集合嵌套之ArrayList嵌套ArrayList实例

    2021-06-23 07:32:25
  • Java Swing JButton按钮的实现示例

    2023-05-05 00:25:43
  • Java线程中sleep和wait的区别详细介绍

    2021-08-27 02:23:12
  • Spring学习教程之AOP模块的概述

    2022-06-04 00:17:13
  • java基础-数组扩容详解

    2022-05-24 00:34:58
  • Java的静态类型检查示例代码详解

    2023-08-09 10:42:13
  • 使用AOP拦截Controller获取@PathVariable注解传入的参数

    2023-04-30 21:42:09
  • idea mybatis配置log4j打印sql语句的示例

    2023-11-25 10:32:39
  • C#实现的json序列化和反序列化代码实例

    2022-04-05 22:24:08
  • java8到java15的新功能简介

    2023-07-28 02:18:18
  • 详解Java线程-守护线程与用户线程

    2023-11-25 00:17:29
  • Mybatis-Spring源码分析图解

    2023-07-18 13:35:07
  • java中的静态代码块、构造代码块、构造方法详解

    2023-06-18 12:11:32
  • spring-boot使用AOP统一处理日志

    2023-06-09 05:12:35
  • java dump文件怎么生成和分析-JMAP用法详解

    2021-06-03 23:59:43
  • Lombok中@EqualsAndHashCode注解的使用及说明

    2023-11-30 04:47:05
  • 关于spring boot中几种注入方法的一些个人看法

    2022-09-07 10:15:14
  • asp之家 软件编程 m.aspxhome.com