之所以想写这一系列,是因为之前工作过程中使用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
目录
- 1 过滤器原理
- 2 Spring Security的过滤器链
- 3 重要的过滤器
-
- 3.1 SecurityContextHolderFilter(SecurityContextConfigurer)
- 3.2 UsernamePasswordAuthenticationFilter(FormLoginConfigurer)
- 3.3 BasicAuthenticationFilter(HttpBasicConfigurer)
- 3.4 DefaultLoginPageGeneratingFilter(DefaultLoginPageConfigurer)
- 3.5 LogoutFilter(LogoutConfigurer)
- 3.6 DefaultLogoutPageGeneratingFilter(DefaultLoginPageConfigurer)
- 3.7 ExceptionTranslationFilter(ExceptionHandlingConfigurer)
- 3.8 AuthorizationFilter(AuthorizeHttpRequestsConfigurer)
前面介绍了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


1014

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



