Spring Security过滤器链加载原理|学习笔记

简介: 快速学习 Spring Security 过滤器链加载原理

开发者学堂课程【Spring Security知识精讲与实战演示(一)Spring Security过滤器链加载原理】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/730/detail/13032


Spring Security过滤器链加载原理

 

过滤器链加载原理

Spring Security 常用的十五个过滤器,但是我们并没有在项目中配置如此多的过滤器,这些过滤器从哪来的呢?

在代码 web.xml 中只配置了如下:

<filter>

<filter-name>springSecurityFilterChain</filter-name>

<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

</filter>

<filter-mapping>

<filter-name>springSecurityFilterChain</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

那么多个过滤器从哪来呢?点击 DelegatingFilterProxy,点进后是一个过滤器,查找doFilter,核心代码为 delegateToUse = this.initDelegate(wac);经过一系列if判断,然后进行初始化 Delegate,然后this.invokeDelegate(delegateToUse,request,response,filterChain)执行,让过滤器起作用,真正封装过滤器、过滤器加载是在initDelegate中。点击initDelegate 进入查看真正封装代码:

protected Filter initDelegate(WebApplicationContext wac)throws ServletException{

String targetBeanName = this.getTargetBeanName() ;

Assert.state( expression: targetBeanName != null, message:"No target bean name set");

Filter delegate = (Filter)wac.getBean(targetBeanName,Filter.class) ;

if (this.isTargetFilterLifecycle()){

delegate.init(this.getFilterConfig());

}

可以先对第二行进行断点,注意这些过滤器必须在项目启动时加载,点击debug关闭。

显示:targetBeanName 是目标对应名称, targetBeanName=”springSecurityFilterChain”。

getBean是通过id取名称即通过对象的id获取对象,所以 targetBeanName 不能乱写。targetBeanName 通过名字 springSecurityFilterChain 去获取对象。

控制台中再点击下一步查看 delegate,显示delegate={FilterChainProxy@4684}”FilterChainProxy[Filter Chains:[[any request,[org.springframework.security.web.context.SecurityContext...]]”

并不是有关十五个过滤器,所以继续向下查看

delegate 是得到对象后返回,但是返回的不是 springSecurityFilterChain,所以追踪 springSecurityFilterChain 对象继续寻找。

刚才讲解了 DelegatingFilterProxy,查找到 FilterChainProxy。所以在代码中查找FilterChainProxy,找到 FilterChainProxy.class中的FilterChainProxy,还是过滤器,所以继续找dofilter。在寻找之前会发现存在SecurityFilterChain,与上述的springSecurityFilterChain接近。找到doFilter,看到代码中无论if或是else都执行doFilterInternal,点进doFilterInternal。不能看懂原理继续打断点,点debug,代码中存在很多过滤器,查看List<Filter>filters = this.getFilters((HttpServletRequest)fwRequest)是否是我们需要的过滤器,结果显示

image.png

再往下可以看到显示讲解的十五个过滤器,所以理解其中的过滤器链是FilterChainProxy 在封装,但是还不能确定过滤器链。

继续在 debug中查看,已经找到了十五个过滤器,之后运行了getFilters,再点进getFilters,发现过滤器链确实存在 SecurityFilterChain中。点进SecurityFilterChain,可以查看它的实现类只有一个 DefaultSecurityfFilterChain。

总结getFilters放置过滤器链,配置 springSecurityFilterChain,实际上过滤器链在SecurityFilterChain中进行存放,实现类为 DefaultSecurityfFilterChain。即springSecurity中的过滤器链中的过滤器由对象SecurityFilterChain封装。

以上就是过滤器链加载的原理。

相关文章
|
23天前
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
92 5
|
1月前
|
XML Java 开发者
Spring Boot开箱即用可插拔实现过程演练与原理剖析
【11月更文挑战第20天】Spring Boot是一个基于Spring框架的项目,其设计目的是简化Spring应用的初始搭建以及开发过程。Spring Boot通过提供约定优于配置的理念,减少了大量的XML配置和手动设置,使得开发者能够更专注于业务逻辑的实现。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,为开发者提供一个全面的理解。
34 0
|
7天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
52 14
|
19天前
|
JavaScript Java Kotlin
深入 Spring Cloud Gateway 过滤器
Spring Cloud Gateway 是新一代微服务网关框架,支持多种过滤器实现。本文详解了 `GlobalFilter`、`GatewayFilter` 和 `AbstractGatewayFilterFactory` 三种过滤器的实现方式及其应用场景,帮助开发者高效利用这些工具进行网关开发。
110 1
|
29天前
|
监控 IDE Java
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
47 8
|
29天前
|
Java 开发者 Spring
Spring AOP 底层原理技术分享
Spring AOP(面向切面编程)是Spring框架中一个强大的功能,它允许开发者在不修改业务逻辑代码的情况下,增加额外的功能,如日志记录、事务管理等。本文将深入探讨Spring AOP的底层原理,包括其核心概念、实现方式以及如何与Spring框架协同工作。
|
1月前
|
前端开发 Java 开发者
Spring生态学习路径与源码深度探讨
【11月更文挑战第13天】Spring框架作为Java企业级开发中的核心框架,其丰富的生态系统和强大的功能吸引了无数开发者的关注。学习Spring生态不仅仅是掌握Spring Framework本身,更需要深入理解其周边组件和工具,以及源码的底层实现逻辑。本文将从Spring生态的学习路径入手,详细探讨如何系统地学习Spring,并深入解析各个重点的底层实现逻辑。
65 9
|
2月前
|
前端开发 Java 数据库
SpringBoot学习
【10月更文挑战第7天】Spring学习
43 9
|
1月前
|
Java Kotlin 索引
学习Spring框架特性及jiar包下载
Spring 5作为最新版本,更新了JDK基线至8,修订了核心框架,增强了反射和接口功能,支持响应式编程及Kotlin语言,引入了函数式Web框架,并提升了测试功能。Spring框架可在其官网下载,包括文档、jar包和XML Schema文档,适用于Java SE和Java EE项目。
33 0
|
2月前
|
XML Java 数据格式
Spring学习
【10月更文挑战第6天】Spring学习
27 1