SpringSecurity6 | 自动配置(上)

在这里插入图片描述
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉
🍎个人主页:Leo的博客
💞当前专栏: Java从入门到精通
✨特色专栏: MySQL学习
🥭本文内容:SpringSecurity6 | 自动配置(上)
🖥️个人小站 :个人博客,欢迎大家访问
📚个人知识库: Leo知识库,欢迎大家访问

✨✨ 粉丝福利订阅✨✨

在这里插入图片描述

Leo哥收集了一些关于面试以及其他学习资源,这里分享给大家,各位卷王快收下吧!!!

学习参考 :

  • 讲师:孙帅老师
  • 课程:孙哥说SpringSecurity6

image-20231030235443828

1.前言

大家好,我是Leo哥🫣🫣🫣,上一节我们了解了SpringSecurity中一些核心过滤器。后面我们将逐渐揭开为什么引入依赖之后就会进行登录鉴权这一神秘面纱。那就是通过SpringBoot的一些自动配置为我们动态的加入了鉴权配置。但是我们真正的了解他,还是需要了解我们SpringBoot项目的自动配置。但是我们这里会简单介绍一下,如果想要深入学习SpringBoot的自动配置,请看这篇。好了,话不多说让我们开始吧😎😎😎。

2.问题回顾

还记得我们之前的问题吗,为什么我们引入了SpringSecurity依赖之后,我们项目所有的请求都需要做登录认证才可以进行访问呢。在了解到这个问题之前,我们需要学习了解一下关于SpringBoot自动装配。

3.简述SpringBoot自动配置

这里我画了一张图让大家更清晰地了解关于SpringBoot配置的整合流程。

自动配置

3.@SpringBootApplication

  • 自动导入配置包

  • 点进去查看代码:

    image-20231117102228841

@Import 为spring的注解,导入一个配置文件,在springboot中为给容器导入一个组件,而导入的组件由 AutoConfigurationPackages.class的内部类Registrar.class 执行逻辑来决定是如何导入的。

@Import({Registrar.class})

点Registrar.class进去查看源码如下:

image-20231117102431579

注:Registrar实现了ImportBeanDefinitionRegistrar类,就可以被注解@Import导入到spring容器里。

3.2@Import

作用:AutoConfigurationImportSelector开启自动配置类的导包的选择器,即是带入哪些类,有选择性的导入

点AutoConfigurationImportSelector.class进入查看源码,这个类中有两个方法见名知意:

  1. selectImports: 选择需要导入的组件

    image-20231117102740858

  2. getAutoConfigurationEntry: 根据导入的@Configuration类的AnnotationMetadata返回AutoConfigurationImportSelector.AutoConfigurationEntry

    image-20231117102910319

this.getCandidateConfigurations(annotationMetadata, attributes)这里断点查看

image-20231117103534021

image-20231117103459562

configurations数组长度为127,并且文件后缀名都为 **AutoConfiguration

结论: 这些都是候选的配置类,经过去重,去除需要的排除的依赖,最终的组件才是这个环境需要的所有组件。有了自动配置,就不需要我们自己手写配置的值了,配置类有默认值的。

3.3自动配置核心

我们继续往下看看是如何返回需要配置的组件的

1.getCandidateConfigurations

方法如下:

image-20231117103839447

getCandidateConfigurations方法从给定的注解元数据和属性中获取候选项配置,并返回一个包含自动配置类的列表。它首先从AnnotationMetadata中获取AutoConfiguration的导入属性,然后使用这些导入属性从AutoConfiguration类的META-INF/spring/org.springframework.boot.autoconfigure目录中加载自动配置类的候选项。如果候选项为空,则会抛出一个异常。最后,它返回候选项列表。

那么是从哪里加载出来的呢,我们接下来点进去load方法打一个断点进行查看。

image-20231117104302312

load是一个静态方法,用于加载指定注解类型的候选项。它接受两个参数:注解类型类加载器。函数首先检查注解是否为空,然后根据给定的类加载器决定使用哪个类加载器。接下来,它根据注解的名称构建一个URL路径,并在类路径中查找该路径下的所有URL。然后,它遍历所有的URL,读取候选配置信息,并将其添加到一个列表中。最后,函数将该列表封装到一个ImportCandidates对象中,并返回它。

2.getSpringFactoriesLoaderFactoryClass()

我们点进去发现:this.getSpringFactoriesLoaderFactoryClass()返回的是EnableAutoConfiguration.class这个注解。这个注解和@SpringBootApplication下标识注解是同一个注解。

protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
    return EnableAutoConfiguration.class;
}

结论:获取一个能加载自动配置类的类,即SpringBoot默认自动配置类为EnableAutoConfiguration

3.4SpringSecurity核心配置

image-20231117104438334

此时就会加载这两个组件:SpringBootWebSecurityConfiguration.class, SecurityDataConfiguration.class 尤其是第一个。

3.5SpringBootWebSecurityConfiguration

终于在最后SpringBootWebSecurityConfiguration我们有了重大发现。

这里边只有一个@Bean注解,最终会创建一个对象:SecurityFilterChain,为什么最终引入了SpringSecurity依赖之后就会所有的请求都会被拦截答案就在这个方法里边。可算揭开了他的神秘面纱。

image-20231117104759287

3.6小结

基于SpringBoot的自动装配,由于SpringSecurity的装配配置在SpringBoot配置环境中,所以它默认会被加载,加载完毕之后defaultSecurityFilterChain被调用,SecurityFilterChain对象被创创建。所有的方法都会被被鉴权。

具体的方法调用路径或者叫配置路径是这样的:首先是三个核心的注解:

@SpringBootApplication-> @EnableAutoConfiguration>@Import(AutoConfigurationImportSelector)

然后通过@Import注解去加载他的所有配置文件到SpringBoot中。这样加载到SpringSecurity的核心文件。最终调用到上边的方法,导致所有的方法都得进行登录认证。

4.参考文献

  • https://springdoc.cn/spring-security/servlet/architecture.html

5.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

ToLeoJavaer公众号 (微信搜索程序员Leo)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/157273.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Android 实现三维空间坐标系(WebView与JS交互,支持多条曲线,可设置坐标轴翻转等)

全部代码已经上传,点击上方进行下载 支持多条曲线的绘制,可旋转拖动放大缩小 1.布局文件: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns:app=&quo…

【Linux】第十七站:进程创建与进程终止

文章目录 一、进程创建1.fork函数2.写时拷贝3.批量化创建多个进程 二、进程终止1.进程退出场景2.进程退出的方法&#xff08;1&#xff09;exit和return&#xff08;2&#xff09;_exit和exit 一、进程创建 1.fork函数 在linux中fork函数时非常重要的函数&#xff0c;它从已存…

Java 中的全部锁

目录 一. 前言 二. 乐观锁 VS 悲观锁 三. 自旋锁 VS 适应性自旋锁 四. 无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁 五. 公平锁 VS 非公平锁 六. 可重入锁 VS 非可重入锁 七. 独享锁&#xff08;排他锁&#xff09; VS 共享锁 八. 总结 一. 前言 Java提供了种类丰富的锁&a…

中小型企业内网搭建

某中小型公司客户提出网络比较单一整体都在一个大的广播域中&#xff0c;AP无线的SSID有很多个&#xff0c;包括一些小的无线路由器散发出来的信号&#xff0c;用起来网络不太稳定&#xff0c;并且AP的SSID要分开&#xff0c;办公室只有单个SSID&#xff0c;不允许出现其他的&a…

vue3+vite+ts 发布自定义组件到npm

vue3vite 发布自定义组件到npm 初始化项目编写组件配置打包组件上传到npm测试组件库 初始化项目 // 创建项目 pnpm create vite vue-test-app --template vue-ts// 运行项目 cd vite vue-test-app pnpm install pnpm run dev编写组件 1、根目录下创建packages目录作为组件的开…

leetcode刷题日志-151反转字符串中的单词

给你一个字符串 s &#xff0c;请你反转字符串中 单词 的顺序。 单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。 返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。 注意&#xff1a;输入字符串 s中可能会存在前导空格、尾随…

面向对象成员之属性

属性:通过方法改造出来 # 1.编写时 # 方法上方写property # 方法参数:只有一个self # 2.使用时:无需加括号 对象.方法 # 3.应用场景:对于简单的方法,当无需传参且有返回值时,可以使用 property class Foo(object):def _init_(self):...propertydef start(self):return 1pr…

【vitis】 AIE basic

AIE vs AIE-ML versal 期间分类 文件 操作 vitis -new -w . 安装

易点易动固定资产管理系统场景应用一:集成ERP/财务系统

在企业的日常运营中&#xff0c;固定资产管理是一个重要而繁琐的任务。传统的手工管理方式往往效率低下且容易出错&#xff0c;给企业带来不必要的成本和风险。为了解决这一问题&#xff0c;易点易动固定资产管理系统应运而生。本文将重点介绍易点易动固定资产管理系统在集成ER…

【C语法学习】26 - strcat()函数

文章目录 1 函数原型2 参数3 返回值4 使用说明5 示例5.1 示例1 1 函数原型 strcat()&#xff1a;将src指向的字符串拼接在dest指向的字符串末尾&#xff0c;函数原型如下&#xff1a; char *strcat(char *dest, const char *src);2 参数 strcat()函数有两个参数src和dest&am…

SAP BAPI BAPI_CLASS_EXISTENCECHECK

物料分类是否存在的BAPI

Molecular Plant | ChIP-seq+RNA-seq解析E2F转录因子在植物复制胁迫响应中的独特和互补作用

生物体的生存完全依赖于它们对基因组完整性的维持&#xff0c;而基因组完整性受到增殖细胞复制胁迫的永久威胁。尽管植物DNA损伤反应&#xff08;DDR&#xff09;调节因子SOG1已被证明能够应对复制缺陷&#xff0c;但越来越多的证据表明&#xff0c;还有其他途径独立于SOG1发挥…

【IDEA 使用easyAPI、easyYapi、Apifox helper等插件时,导出接口文档缺少代码字段注释的相关内容、校验规则的解决方法】

问题 IDEA 使用easyAPI、easyYapi、Apifox helper等插件时&#xff0c;导出的接口文档上面&#xff0c;缺少我们代码里的注解字段&#xff0c;如我们规定了NOTNULL、字段描述等。 问题链接&#xff0c;几个月之前碰到过&#xff0c;并提问了&#xff0c;到现在解决&#xff0c…

k8s ingress高级用法一

前面的文章中&#xff0c;我们讲述了ingress的基础应用&#xff0c;接下来继续讲解ingress的一些高级用法 一、ingress限流 在实际的生产环境中&#xff0c;有时间我们需要对服务进行限流&#xff0c;避免单位时间内访问次数过多&#xff0c;常用的一些限流的参数如下&#x…

【Android】如何使用模拟器调试安卓项目

1、电脑安装逍遥模拟器&#xff0c;用来跑安卓项目。安装好模拟器之后&#xff0c;直接起安卓项目&#xff0c;自动会在选择设备处显示 2、如果前端是安卓后端是其他语言的话&#xff0c;这种前后端分离的模式&#xff0c;需要监听端口&#xff0c;原因是运行安卓和后端编译器都…

设计模式-11-模板模式

经典的设计模式有23种&#xff0c;但是常用的设计模式一般情况下不会到一半&#xff0c;我们就针对一些常用的设计模式进行一些详细的讲解和分析&#xff0c;方便大家更加容易理解和使用设计模式。 1-什么是模板模式 模板模式&#xff0c;全称是模板方法设计模式&#xff0c;英…

spark的资源调度与任务调度

blockManager 资源调度与任务调度

LangChain:打造自己的LLM应用

文章来源&#xff1a;https://www.cnblogs.com/jingdongkeji/p/17599838.html 1、LangChain是什么 LangChain是一个框架&#xff0c;用于开发由LLM驱动的应用程序。可以简单认为是LLM领域的Spring&#xff0c;以及开源版的ChatGPT插件系统。核心的2个功能为&#xff1a; 1&am…

国鑫受邀出席2023英特尔中国区数据中心渠道客户金秋会

10月18日&#xff0c;2023英特尔中国区数据中心渠道客户金秋会在重庆隆重举行&#xff0c;本次会议共邀请了全国英特尔数据中心渠道生态伙伴、本地服务器系统设计及制造厂商参与&#xff0c;Gooxi作为英特尔在中国区重要合作伙伴受邀参加。 会上&#xff0c;英特尔向生态合作伙…

玩具、儿童用品、儿童服装上亚马逊TEMU平台CPC认证办理

CPC认证是Childrens Product Certificate的简称&#xff0c;即儿童产品证书。它是美国强制性法规CPSIA要求的一部分&#xff0c;该法规主要针对12岁及以下儿童使用的产品&#xff0c;如玩具、儿童用品、儿童服装等。 一、儿童小汽车CPC测试项目可能会因产品标准和法规的不同而…