当前位置: 首页 > news >正文

SpringSecurity: 默认添加的15个Filter是怎么添加进去的?

总的流程分为两部分,一是先用Map把configurer收集起来,然后再把maper中所有的configurer应用到HttpSecurity对象。

其中的map位于AbstractConfiguredSecurityBuilder这个类。

    private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers;

configurer添加分为两部分,都通过WebSecurityConfigurerAdapter的init方法来实现,

    public void init(WebSecurity web) throws Exception {HttpSecurity http = this.getHttp();web.addSecurityFilterChainBuilder(http).postBuildAction(() -> {FilterSecurityInterceptor securityInterceptor = (FilterSecurityInterceptor)http.getSharedObject(FilterSecurityInterceptor.class);web.securityInterceptor(securityInterceptor);});}

其中init方法会调用的 protected final HttpSecurity getHttp() throws Exception方法:

    protected final HttpSecurity getHttp() throws Exception {if (this.http != null) {return this.http;} else {AuthenticationEventPublisher eventPublisher = this.getAuthenticationEventPublisher();this.localConfigureAuthenticationBldr.authenticationEventPublisher(eventPublisher);AuthenticationManager authenticationManager = this.authenticationManager();this.authenticationBuilder.parentAuthenticationManager(authenticationManager);Map<Class<?>, Object> sharedObjects = this.createSharedObjects();this.http = new HttpSecurity(this.objectPostProcessor, this.authenticationBuilder, sharedObjects);if (!this.disableDefaults) {//添加第一部分configurerthis.applyDefaultConfiguration(this.http);ClassLoader classLoader = this.context.getClassLoader();List<AbstractHttpConfigurer> defaultHttpConfigurers = SpringFactoriesLoader.loadFactories(AbstractHttpConfigurer.class, classLoader);Iterator var6 = defaultHttpConfigurers.iterator();while(var6.hasNext()) {AbstractHttpConfigurer configurer = (AbstractHttpConfigurer)var6.next();this.http.apply(configurer);}}//这句代码调用本类中的configure方法继续添加configurerthis.configure(this.http);return this.http;}}

该方法中执行了this.applyDefaultConfiguration(this.http),其代码为:

   private void applyDefaultConfiguration(HttpSecurity http) throws Exception {http.csrf();http.addFilter(new WebAsyncManagerIntegrationFilter());http.exceptionHandling();http.headers();http.sessionManagement();http.securityContext();http.requestCache();http.anonymous();http.servletApi();http.apply(new DefaultLoginPageConfigurer());http.logout();}

另一部分是通过WebSecurityConfigurerAdapter的config方法添加的configurer

    protected void configure(HttpSecurity http) throws Exception {this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");http.authorizeRequests((requests) -> {((AuthorizedUrl)requests.anyRequest()).authenticated();});http.formLogin();http.httpBasic();}

至此,configurers填充完毕。
在这里插入图片描述

AbstractConfigedSecurityBuilder的private void configure() throws Exception
这个方法会遍历之前填充好的configurer,将其应用到HttpSecurity对象,也就是添加了Fliter

   private void configure() throws Exception {Collection<SecurityConfigurer<O, B>> configurers = this.getConfigurers();Iterator var2 = configurers.iterator();while(var2.hasNext()) {SecurityConfigurer<O, B> configurer = (SecurityConfigurer)var2.next();configurer.configure(this);}}

该方法的循环体执行完成后HttpSecurity对象就包含了15个过滤器。
在这里插入图片描述
以上是使用Spring Security5进行的分析。
Spring Security 6使用AuthorizationFilter取代了FilterSecurityInterceptor

http://www.lryc.cn/news/29137.html

相关文章:

  • 学习记录---latent code 潜在编码
  • Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等
  • 2023年备考信息安全工程师每日知识点(1)
  • Unity记录3.1-地图-TileMap简单使用、鼠标拖动放置Tile
  • Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析
  • IronWebScraper 2023.2.2 Crack
  • 【2.1 golong中条件语句if】
  • Scala编程(第四版)
  • aws apigateway 基础概念和入门示例
  • 2023年“中银杯”安徽省职业院校技能大赛网络安全A模块全过程解析
  • 【Python入门第二十四天】Python 迭代器
  • Qt扫盲-CMake 使用概述
  • minGW-w64配置途径
  • 程序、进程、线程的基本概念、信号量的PV操作、前趋图的PV操作
  • 设计测试用例
  • CSS 选择器以及CSS常用属性
  • 测试概念及模型
  • 王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记
  • 【C++升级之路】第八篇:string类
  • mysql性能优化_原理_课程大纲
  • 项目管理报告工具的功能
  • centos8上安装hbase
  • linux 进程及调度基础知识
  • Python计算分类问题的评价指标(准确率、精确度、召回率和F1值,Kappa指标)
  • 51单片机LCD1602的使用
  • [深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?
  • zio1升级到zio2踩坑和总结
  • 【算法题】1834. 单线程 CPU
  • Vue学习[2023]
  • 【Redis】Redis分片集群