一、一句话概括框架原理
整个框架的核心就是构建一个名字为
springSecurityFilterChain
的过滤器Bean,它的类型是FilterChainProxy
。
二、何处开始读源码?
思考
我们知道,程序入口类会自动扫描当前包及其子包下所有的Bean,并进行实例化,那么
在引入一个新的框架,框架中一些定义好的Bean如何注入我们的Spring容器中呢?
,这些包并不能被入口类扫描中。
其实无非就是通过
@Import
引入相关的类。一般在使用Spring Security
框架时,我们会自定义一个配置类,配置类加上@EnableWebSecurity
注解,重新启动程序,一个使用了安全框架的项目就起来了,在无任何自定义配置情况下Spring Security
默认配置了一个登录过滤器链。
加个
@EnableWebSecurity
注解就可以,怎么做到的?
瞅瞅
- 点击自定义配置类上添加的
@EnableWebSecurity
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ WebSecurityConfiguration.class,
SpringWebMvcImportSelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
/**
* Controls debugging support for Spring Security. Default is false.
* @return if true, enables debug support with Spring Security
*/
boolean debug() default false;
}
-
重点关注
@Import
导入的类WebSecurityConfiguration
,会发现类中定义了很多Bean -
其中就有我们的核心过滤器
springSecurityFilterChain
@Configuration
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
...
/**
* Creates the Spring Security Filter Chain
* @return
* @throws Exception
*/
@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public Filter springSecurityFilterChain() throws Exception {
boolean hasConfigurers = webSecurityConfigurers != null
&& !webSecurityConfigurers.isEmpty();
if (!hasConfigurers) {
WebSecurityConfigurerAdapter adapter = objectObjectPostProcessor
.postProcess(new WebSecurityConfigurerAdapter() {
});
webSecurity.apply(adapter);
}
return webSecurity.build();
}
...
}
找到创建核心过滤器的地方,是不是迫不及待想开始读了?咱们先不急,先来了解整个框架的接口设计,以及各个类的职能。
三、框架接口设计
整个框架主要由
建造者
和配置器
构成,在服务启动时就是通过配置器对建造者进行配置
,配置完成再由建造者创建出核心过滤器。
建造者
-
UML图(方法、属性等自行打开Idea查看,全部打开太占位置没法截图就截了简单的类关系)
涉及到创建
springSecurityFilterChain
的建造者是HttpSecurity
和WebSecurity
,接下来文章介绍,AuthenticationManagerBuilder
先放放,后面讲解如何认证授权时详细介绍。
配置器
-
UML类图
一般我们会使用底层的两个配置器
WebSecurityConfigurerAdapter
和AbstractHttpConfigurer
,后续文章详细介绍。
四、总结
WebSecurity
和HttpSecurity
都是建造者
WebSecurity
的构建目标是FilterChainProxy
对象,即核心过滤器springSecurityFilterChain
HttpSecurity
的构建目标只是FilterChainProxy
对象中一组SecurityFilterChain
的一个配置器
是通过HttpSecurity
配置进建造者
中用于构建SecurityFilterChain
五、系列文章
Spring Security 系列
- 《手把手教你如何使用Spring Security(上):登录授权》
- 《手把手教你如何使用Spring Security(中):接口认证》
- 《手把手教你如何使用Spring Security(下):访问控制》
- 《Spring Security源码(一):整体框架设计》
- 《Spring Security源码(二):建造者详解》
- 《Spring Security源码(三):HttpSecurity详解》
- 《Spring Security源码(四):配置器详解》
- 《Spring Security源码(五):FilterChainProxy是如何创建的?》
- 《Spring Security源码(六):FilterChainProxy是如何运行的?》
- 《Spring Security源码(七):设计模式在框架中的应用》
- 《Spring Security源码(八):登录认证源码流程》
- 《Spring Security源码(九):过滤器链上的过滤器是如何排序的?》
- 《Spring Security源码(十):权限访问控制是如何做到的?》
Spring Security OAuth 系列
Java 面试宝典是大明哥全力打造的 Java 精品面试题,它是一份靠谱、强大、详细、经典的 Java 后端面试宝典。它不仅仅只是一道道面试题,而是一套完整的 Java 知识体系,一套你 Java 知识点的扫盲贴。
它的内容包括:
- 大厂真题:Java 面试宝典里面的题目都是最近几年的高频的大厂面试真题。
- 原创内容:Java 面试宝典内容全部都是大明哥原创,内容全面且通俗易懂,回答部分可以直接作为面试回答内容。
- 持续更新:一次购买,永久有效。大明哥会持续更新 3+ 年,累计更新 1000+,宝典会不断迭代更新,保证最新、最全面。
- 覆盖全面:本宝典累计更新 1000+,从 Java 入门到 Java 架构的高频面试题,实现 360° 全覆盖。
- 不止面试:内容包含面试题解析、内容详解、知识扩展,它不仅仅只是一份面试题,更是一套完整的 Java 知识体系。
- 宝典详情:https://www.yuque.com/chenssy/sike-java/xvlo920axlp7sf4k
- 宝典总览:https://www.yuque.com/chenssy/sike-java/yogsehzntzgp4ly1
- 宝典进展:https://www.yuque.com/chenssy/sike-java/en9ned7loo47z5aw
目前 Java 面试宝典累计更新 400+ 道,总字数 42w+。大明哥还在持续更新中,下图是大明哥在 2024-12 月份的更新情况:
想了解详情的小伙伴,扫描下面二维码加大明哥微信【daming091】咨询
同时,大明哥也整理一套目前市面最常见的热点面试题。微信搜[大明哥聊 Java]或扫描下方二维码关注大明哥的原创公众号[大明哥聊 Java] ,回复【面试题】 即可免费领取。