SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解(源码级别讲解,耐心)

简介: 该内容是关于SpringSecurity在SpringBoot中的自动配置详解。文章首先提出问题:SpringSecurity如何在引入依赖后使所有请求需认证并显示登录表单。接着,它探讨了SpringBoot的自动装配原理,从@SpringBootApplication注解开始,深入到@EnableAutoConfiguration的实现,解释了如何通过扫描jar包中的.imports文件来加载自动配置类。特别提到了SpringBootWebSecurityConfiguration类,该类默认设置为对所有请求进行认证,并支持表单和Basic认证。

SpringSecurity6从入门到实战之SpringSecurity整合自动装配详解

这里我先引出问题然后再来一步步进行剖析,SpringSecurity到底是如何实现引入依赖后所有请求都需要进行认证并且会弹出login登录表单页面.

接下来会对SpringBoot的自动装配进行详解,SpringSecurity也是通过自动装配实现以上一系列操作的

流程分析

SpringBoot自动装配原理

首先看到启动类上的@SpringBootApplication注解

@SpringBootApplication是一个复合注解也可以说是一个组合注解,我们通过查看源码的方式点击去看看

可以看到@SpringBootConfiguration注解代表标注当前为SpringBoot配置类,@EnableAutoConfiguration注解代表开启自动装配,@ComponentScan代表需要扫描的组件.这里主要需要进行深入的就是@EnableAutoConfiguration,因为需要深入SpringBoot是如何进行自动配置的,我们进入@EnableAutoConfiguration源码中.

可以看到这里@Import导入了作为参数的这个类,AutoConfigurationImportSelector便是在容器中自动导入一些组件,我们继续看看这个类的源码

这里直接搜索getAutoConfigurationEntry()这个方法,这个方法是获取自动配置的内容.下面这行代码很重要,返回了一个List的configurations,我们进入与之对应的getCandidateConfigurations()源码中看看

List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);

然后我们继续看看这个ImportCandidates.load()的源码到底加载什么内容

findUrlsInClasspath() 方法扫描所有jar包类路径下 META-INF/spring/%s.imports(META-INF/spring/目录下所有以.imports结尾)



根据 .imports 文件中获取到 xxxAutoConfiguration 类名,然后把他们添加在容器中,进行自动装配如,org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,我们继续查看源码.

SpringBootWebSecurityConfiguration

这个类是 spring boot 自动配置类,通过这个源码得知,默认情况下对所有请求进行权限控制:

这里指定了所有的请求都需要进行认证操作,并且支持表单登录和Basic认证

使用条件

# SpringBootWebSecurityConfiguration默认配置的使用条件限制:
- classpath下存在 SecurityFilterChain.class, HttpSecurity.class
- 当前应用中没有 SecurityFilterChain 的实例

这里说明我们没有进行自定义的任何配置,SpringBoot就会采用自动加载默认配置.

通过这个注解可以看到默认配置的条件限制是什么

最终可以发现一个是基于Bean的另外一个是基于类的也就与刚刚能够对上了,classpath下存在 SecurityFilterChain.class, HttpSecurity.class,当前容器中没有 SecurityFilterChain 的实例

相关文章
|
2月前
|
Java
springboot自动注入避坑
springboot自动注入避坑
24 1
|
3月前
|
XML Java 数据格式
【springboot原理篇】Bean的加载方式,面试必看
【springboot原理篇】Bean的加载方式,面试必看
|
3月前
|
Java 数据库连接 Maven
SpringBoot【付诸实践 01】SpringBoot自定义starter保姆级教程(说明+源码+配置+测试)
SpringBoot【付诸实践 01】SpringBoot自定义starter保姆级教程(说明+源码+配置+测试)
57 1
|
JSON 前端开发 架构师
SpringBoot 如何进行参数校验?老鸟们都是这么玩的!
SpringBoot 如何进行参数校验?老鸟们都是这么玩的!
198 0
|
Java API Spring
SpringBoot中“@SpringBootApplication“自动配置原理《第七课》
SpringBoot中“@SpringBootApplication“自动配置原理《第七课》
125 0
|
Java 容器 Spring
Springboot源码:自动装配流程解析
Springboot源码:自动装配流程解析
62 0
|
Java Spring
Spring文件第四课SpringIOC 的三种方案利用注解的方式(二)
Spring文件第四课SpringIOC 的三种方案利用注解的方式(二)
87 0
|
Java 程序员 Spring
Spring文件第四课SpringIOC 的三种方案利用注解的方式(一)
Spring文件第四课SpringIOC 的三种方案利用注解的方式(一)
104 0
Spring文件第四课SpringIOC 的三种方案利用注解的方式(一)
|
Java Spring 容器
从源码角度查看SpringBoot是怎样获取到Bean的
我们都知道在SpringBoot启动类上添加@SpringBootApplication注解后执行main方法就可以自动启动服务 Spring会自动帮我们找到需要管理的Bean的呢
147 0
|
缓存 Java Spring
Spring&SpringBoot源码笔记整理 |Bean的加载流程二
昨天的文章里提到Bean的加载流程和如何获取bean,今天继续源码解读。还是老规矩,看着Bean加载的时序图进入主题。
312 0
Spring&SpringBoot源码笔记整理 |Bean的加载流程二