Spring Security 6 系列之三 - Filter过滤器

之所以想写这一系列,是因为之前工作过程中使用Spring Security,但当时基于spring-boot 2.3.x,其默认的Spring Security是5.3.x。之后新项目升级到了spring-boot 3.3.0,结果一看Spring Security也升级为6.3.0,关键是其风格和内部一些关键Filter大改,导致在配置同样功能时,多费了些手脚,因此花费了些时间研究新版本的底层原理,这里将一些学习经验分享给大家。

注意由于框架不同版本改造会有些使用的不同,因此本次系列中使用基本框架是 spring-boo-3.3.0(默认引入的Spring Security是6.3.0),JDK版本使用的是19,所有代码都在spring-security-study项目上:https://github.com/forever1986/spring-security-study.git


前面介绍了Spring Security的基本入门以及如何自定义用户,但关于Spring Security的基本实现原理还没有好好讲一下。本章就带你了解一下Spring Security的底层原理。

1 过滤器原理

之所以先讲过滤器,是因为Spring Security底层依赖Servlet的过滤器技术。提到过滤器之前,先要理解一个web请求,到达服务器的时候,其处理的方式是通过Servlet。我还记得刚开始学习java web的时候(前后端还没有分离的时候),就写过Servlet,其实就是处理web请求返回资源。包括后来的JSP也是将其转换为一个Servlet,JSP只不过是为了适应展现页面的编程方式。
而过滤器(Filter)是 Servlet 规范中的一部分,它可以在请求到达 Servlet 之前对请求进行预处理,也可以在响应返回给客户端之前对响应进行后处理。过滤器可以用于实现诸如日志记录、字符编码转换、安全控制等功能。比如常见服务器Tomcat的过滤器配置就是可以在 web.xml 文件中进行配置的。

在这里插入图片描述
Filter接口定义了3个方法:doFilter,init和destory,其中doFilter就是请求进入过滤器时需要执行的逻辑。

2 Spring Security的过滤器链

了解完过滤器之后,我们再来看看Spring Security是如何通过过滤器实现自己的认证和授权的。

  • 首先,我们在使用springboot的web其实也是Tomcat、jetty等web服务器,这些web服务器基于本身Servlet 容器中的过滤器是由 Servlet 容器直接管理的,这样就使得你不能方便地使用 Spring 的依赖注入来管理过滤器的依赖,因此Spring提供DelegatingFilterProxy,简单理解就是Spring通过DelegatingFilterProxy可以将你在Spring中注册的过滤器或者过滤器链加入到Servlet 过滤器中。
  • 其次,Spring Security的过滤器是通过FilterChainProxy代理方式加入到链路中,FilterChainProxy 是 Spring Security 提供的一个特殊过滤器,它允许通过 SecurityFilterChain 向多个过滤器实例委托,它通常被封装在 DelegatingFilterProxy中。
  • 最后,Spring Security的SecurityFilterChain才是最终过滤器所在。整体流程如下图

注意:Spring Security是很多个组成一条链路,而且这些过滤器是有顺序。知道这一点对后续自定义功能就比较容易理解。

在这里插入图片描述

3 重要的过滤器

那么在Spring Security中有二、三十个Filter,默认配置下就有16个过滤器(如下图),其实很多你可能不需要关心。但是下面这些Filter你需要了解其原理,因为后续自定义配置上面需要了解其不同Filter的功能,才能自定义配置。
在这里插入图片描述

重要提示:过滤器源码,一般先看doFilter方法,这个方法就是实现其作用的。另外如果觉得看起来有些迷糊,可以先看后面几个自定义配置的章节(自定义登录界面、异常处理、前后端分离等),里面都会讲解与其相关的过滤器。这时候再回来看看这部分会更加清楚

注意:对于Spring Security的每个Filter过滤器的配置都会有对应的AbstractHttpConfigurer,该类是用来配置Filter,Configurer主要看其configure(H http)方法,想知道如何配置或有什么配置,可以直接看源码相关的Configurer类就能知道。

3.1 SecurityContextHolderFilter(SecurityContextConfigurer)

SecurityContextHolderFilter对应的配置类是SecurityContextConfigurer,由SecurityContextConfigurer加入过滤器链的。

SecurityContextHolderFilter:是一个用来存储和获取当前请求的上下文SecurityContext

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linmoo2006

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值