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 的实例