Springboot中SpringSecurity自动装配原理,源码级别绝对详细

这篇具有很好参考价值的文章主要介绍了Springboot中SpringSecurity自动装配原理,源码级别绝对详细。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Springboot中SpringSecurity自动装配原理

(1)Springboot有一个自动配置类SecurityFilterAutoConfigurationSecurityFilterAutoConfiguration只要当项目中引入了SpringSecurity的相关jar包就会被自动加载。装载这个类是干嘛的呢?
(2)如下图,SecurityFilterAutoConfiguration 自动配置类主要用于,当存在名字叫做"springSecurityFilterChain"的bean时,就会往容器中注入一个DelegatingFilterProxyRegistrationBean类对象。所以SecurityFilterAutoConfiguration类对象主要用于生成DelegatingFilterProxyRegistrationBean类对象。
那么名字叫做"springSecurityFilterChain"的bean是从哪里来的呢?我们先按下不表,我们先看下这个DelegatingFilterProxyRegistrationBean类对象是干嘛的。
1684311377493.png
(3)通过下图的继承关系,我们可以看到DelegatingFilterProxyRegistrationBean类继承了RegistrationBean类,而RegistrationBean类实现了ServletContextInitializer接口。
(ServletContextInitializer是springboot内置tomcat时,tomcat初始化后会在TomcatStarter的onStartup方法中调用所有实现了ServletContextInitializer接口的onStartup方法。
和这个类似的是WebApplicationInitializer,WebApplicationInitializer是外置tomcat时,tomcat初始化后会调用程序的SpringServletContainerInitializer类的onStartup,而在onStartup方法中会调用所有实现了WebApplicationInitializer接口的onStartup方法
其实就是tomcat初始化后要调用一个类,然后在这个类中调用程序中某个接口所有实现类的onStartup方法进行处理。

1684396479207.png
1684396520408.png
也就是当servlet容器创建成功后,会自动执行DelegatingFilterProxyRegistrationBean类的onStartup方法。那么它是做了什么操作呢?
(4)通过调式可以追踪到核心的方法链,onStartup()->register()->addRegistration()->getFilter(),最终getFilter()获得的过滤器注册到了servlet容器中。需要注意的是上面一系列方法有些是DelegatingFilterProxyRegistrationBean从父类继承过来的,有些是自己重写的。
1684399887148.jpg
1684399911939.png
1684399937205.png
1684400022409.png
也就是说DelegatingFilterProxyRegistrationBean类的作用是注册了一个过滤器。这个过滤器其实是DelegatingFilterProxy的匿名类。
(5)既然DelegatingFilterProxy是过滤器,那么肯定要看它在doFilter()方法做了什么。
1684400187240.png
1684400246423.png
通过上面的源码,我们可以知道,doFilter()中主要是获取了一个过滤器对象delegateToUse,然后调用了delegateToUse的doFilter()方法。下面我们看看initDelegate()方法获得的是一个怎么样的过滤器对象。
1684400511070.png
可以看到initDelegate()方法中,从spring容器中获取了一个名叫this.getTargetBeanName()的过滤器对象,而this.getTargetBeanName()其实就是我们一开始的"springSecurityFilterChain"。
那么DelegatingFilterProxy类的作用其实就是执行到它时,暂停原有的过滤器链,先执行名叫"springSecurityFilterChain"过滤器的doFilter()方法。

总结上面几步:
SecurityFilterAutoConfiguration自动装配为了注入DelegatingFilterProxyRegistrationBean类DelegatingFilterProxyRegistrationBean类为了向servlet容器注册DelegatingFilterProxy过滤器,DelegatingFilterProxy过滤器中执行名叫"springSecurityFilterChain"的过滤器。
需要注意的是以上的其实都是在springboot中的类,而名叫"springSecurityFilterChain"的过滤器其实是在SpringSecurity中。也就是说上面绕了一大圈,其实目的就是为了实现你引入SpringSecurity的依赖,springboot将SpringSecurity中的过滤器加入到项目中来,而你却什么都不用配置。

(6)名叫"springSecurityFilterChain"的过滤器对象到底是哪里来的?
通过断点可以看到SpringSecurity包中有一个WebSecurityConfiguration类中注入了名叫"springSecurityFilterChain"的FilterChainProxy类对象。我们对FilterChainProxy干嘛的先按下不表,WebSecurityConfiguration又是什么时候注入的呢?要知道WebSecurityConfiguration是在SpringSecurity包中的,我们在项目中又没有主动创建过。
1684401615166.png
1684401673774.png
(7)在SpringSecurity的配置包下有一个 @EnableWebSecurity,在该注解上通过@Import引入了上面的WebSecurityConfiguration类,也就是说我想在我项目中使用SpringSecurity,应该需要在项目中添加@EnableWebSecurity,但是为什么我没加也能使用?
1684376978262.png
(8)大家回头看下(1)中自动装配的SecurityFilterAutoConfiguration,它的类上有一个@AutoConfigureAfter(SecurityAutoConfiguration.class)注解,也就是springboot在这之前会装置一个SecurityAutoConfiguration类。
1684401946214.png
SecurityAutoConfiguration类上,通过@Import引入了四个类,而 @EnableWebSecurity就在其中的SpringBootWebSecurityConfiguration或WebSecurityEnablerConfiguration头上(根据版本有关)

以上总结:->表示右边类通过左边类引入到程序中
第一条线为了创建SpringSecurity的过滤器链(对应上面的6-8步):自动装配了SecurityAutoConfiguration类->@EnableWebSecurity注解->WebSecurityConfiguration类->FilterChainProxy对象(名叫“springSecurityFilterChain”
第二条线为了将SpringSecurity过滤器链插入到servlet过滤器链中(对应上面的1-5布):对应之前的总结。

也就是现在,引入了SpringSecurity后,当有请求到来时,就会触发FilterChainProxy的doFilter()。
(9)FilterChainProxy虽然自己是过滤器,但是通过名字也不难看出,它同时是过滤器链的代理,也就是在该类中保存了SpringSecurity一系列的过滤器链。
1684402788064.png
如下图源码,FilterChainProxy的doFilter()中调用了doFilterInternal()方法,
1684402491729.png
而doFilterInternal()获取了本次请求路径相关的过滤器,然后组合成一个过滤器链,最后调用这个过滤器链。
1684402551901.png
也就是说FilterChainProxy的作用是根据请求路径选择过滤器,将选择的过滤器组合成一个过滤器链。然后执行这条过滤器链。

以上便是SpringSecurity的自动装配原理了。欢迎交流。文章来源地址https://www.toymoban.com/news/detail-450225.html

到了这里,关于Springboot中SpringSecurity自动装配原理,源码级别绝对详细的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot源码-自动装配

      springboot的核心注解@SpringBootApplication 接着看 @SpringBootApplication 注解 截图: 代码:  接着看红框的注解 @EnableAutoConfiguration 截图: 代码:  接着看红框的 AutoConfigurationImportSelector.class 这个类 截图: 接着看接口 DeferredImportSelector 的实现 截图: 在这个DeferredImportSelector类中,

    2024年02月08日
    浏览(26)
  • 【Spring】深究SpringBoot自动装配原理

    早期的 Spring 项目需要添加需要配置繁琐的 xml ,比如 MVC 、事务、数据库连接等繁琐的配置。 Spring Boot 的出现就无需这些繁琐的配置,因为 Spring Boot 基于 约定大于配置 的理念,在项目启动时候,将约定的配置类自动装配到 IOC 容器里。 这些都因为 Spring Boot 有自动装配的特性

    2024年02月14日
    浏览(26)
  • SpringBoot自动装配原理学习与实战运用

    我们知道SpringBoot就是框架的框架,它解决了Spring在开发过程中繁琐的配置问题。例如在引入web、aop、data、cache等等场景,以往我们使用Spring时,会需要向容器中手动配置DispatchServlet、 AspectJAutoProxyingConfiguration等等配置类,而使用SpringBoot框架后,只需要引入spring-boot-starter-xx

    2023年04月13日
    浏览(30)
  • Spring Boot源码解析 - 自动装配原理

    Spring Boot 自动装配是 Spring Boot 框架的一个关键特性,它的目标是让开发者能够快速构建 Spring 应用程序,减少繁琐的配置工作。   @SpringApplication 从启动类 @SpringApplication 注解入手, @SpringBootApplication 是一个组合注解,它是 Spring Boot 框架中常用的一个主要注解之一。它结合了

    2024年01月19日
    浏览(30)
  • 一文足够,SpringBoot自动装配底层源码

    目录 自动装配原理 开始深入源码 总结自动装配原理 首先明白一个概念,什么是自动装配? 我们在项目中建一个yaml或者properties文件,里面配置一些参数,如redis,在pom中引入启动器,之后就能用redis,自动把这些集成到spring中,这就是自动装配。 先来提前剧透: 加载spring.

    2023年04月13日
    浏览(29)
  • SpringBoot源码解读与原理分析(五)SpringBoot的装配机制

    前面三小节分别介绍了Spring Framewoek的模块装配、条件装配和SPI机制。下面正式进入Spring Boot的装配机制。 实际上, Spring Boot的自动装配是模块装配+条件装配+SPI机制的组合使用 ,而这一切都凝聚在Spring Boot主启动类的@SpringBootApplication注解上。 @SpringBootApplication注解是由三个注

    2024年02月19日
    浏览(35)
  • 拆解Spring boot:Springboot为什么如此丝滑而简单?源码剖析解读自动装配

    🎉🎉欢迎光临,终于等到你啦🎉🎉 🏅我是苏泽,一位对技术充满热情的探索者和分享者。🚀🚀 🌟持续更新的专栏 《Spring 狂野之旅:从入门到入魔》 🚀 本专栏带你从Spring入门到入魔   这是苏泽的个人主页可以看到我其他的内容哦👇👇 努力的苏泽 http://suzee.blog.csdn

    2024年03月23日
    浏览(33)
  • SpringSecurity6从入门到上天系列第九篇:SpringSecurity当中的默认用户的生成、存储、认证过程的源码级别分析

    😉😉 欢迎加入我们的学习交流群呀! ✅✅1:这是 孙哥suns 给大家的福利! ✨✨2: 我们免费分享Netty、Dubbo、k8s、Mybatis、Spring等等很多应用和源码级别的高质量视频和笔记资料,你想学的我们这里都有 ! 🥭🥭3:QQ群: 583783824   📚📚  工作VX: BigTreeJava 拉你进VX群,免

    2024年02月03日
    浏览(36)
  • spring自动装配原理

    为了搞明白自动装配原理,需要知道spring容器管理bean的生命周期 分为四步: 1、实例化 读取spring配置文件 通过反射进行bean的实例化(eg:通过BeanFactory实例化) 2、属性赋值 解析 自动装配 (byName、byType、constractor、default)DI的体现 循环依赖 3、初始化 调用XXXAware回调方法

    2024年02月02日
    浏览(27)
  • Spring Boot 自动装配原理

    Java面试题目录 Spring Boot自动装配原理   Spring Boot启动类上的 @SpringBootApplication 注解中包含 @EnableAutoConfiguration 注解,表示开启自动装配。在@EnableAutoConfiguration注解中使用@Import注解引入 AutoConfigurationImportSelector 组件,此类中通过 SpringFactoriesLoader.loadFactoryNames() 方法来扫描所有

    2024年01月25日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包