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

深入理解HttpSecurity的设计

一、HttpSecurity的应用

  在前章节的介绍中我们讲解了基于配置文件的使用方式,也就是如下的使用。

image.png

  也就是在配置文件中通过 security:http 等标签来定义了认证需要的相关信息,但是在SpringBoot项目中,我们慢慢脱离了xml配置文件的方式,在SpringSecurity中提供了HttpSecurity等工具类,这里HttpSecurity就等同于我们在配置文件中定义的http标签。要使用的话方式如下。

image.png

  通过代码结果来看和配置文件的效果是一样的。基于配置文件的方式我们之前分析过,是通过标签对应的handler来解析处理的,那么HttpSecurity这块是如何处理的呢?我们来详细分析下。

二、HttpSecurity的类图结构

image.png

  可以看出HttpSecurity的类图结构相对比较简单,继承了一个父类,实现了两个接口。我们分别来看看他们的作用是什么?

1.SecurityBuilder接口

  我们先来看看SecurityBuilder接口,通过字面含义我们就可以发现这是一个帮我们创建对象的工具类。

public interface SecurityBuilder<O> {
   

	/**
	 * Builds the object and returns it or null.
	 * @return the Object to be built or null if the implementation allows it.
	 * @throws Exception if an error occurred when building the Object
	 */
	O build() throws Exception;

}

  通过源码我们可以看到在SecurityBuilder中给我们提供了一个build()方法。在接口名称处声明了一个泛型,而build()方法返回的正好是这个泛型的对象,其实就很好理解了,也就是SecurityBuilder会创建指定类型的对象。结合HttpSecurity中实现SecurityBuilder接口时指定的泛型我们可以看出创建的具体对象是什么类型。

image.png

  可以看出SecurityBuilder会通过build方法给我们创建一个DefaultSecurityFilterChain对象。也就是拦截请求的那个默认的过滤器链对象。

image.png

然后进入到doBuild()方法,会进入到AbstractConfiguredSecurityBuilder中的方法

	@Override
	protected final O doBuild() throws Exception {
   
		synchronized (this.configurers) {
   
			this.buildState = BuildState.INITIALIZING;
			beforeInit();
			init();
			this.buildState = BuildState.CONFIGURING;
			beforeConfigure();
			configure();
			this.buildState = BuildState.BUILDING;
	 		// 获取构建的对象,上面的方法可以先忽略
			O result = performBuild();
			this.buildState = BuildState.BUILT;
			return result;
		}
	}

进入到HttpSecurity中可以查看performBuild()方法的具体实现。

	@Override
	protected DefaultSecurityFilterChain performBuild() {
   
        // 对所有的过滤器做排序
		this.filters.sort(OrderComparator.INSTANCE);
		List<Filter> sortedFilters = new ArrayList<>(this.filters.size

相关文章:

  • 复习dddddddd
  • kafka-集群缩容
  • Helix——Figure 02发布通用人形机器人控制的VLA:一组神经网络权重下的快与慢双系统,让两个机器人协作干活
  • 网络空间安全(1)web应用程序的发展历程
  • 【Python爬虫(38)】解锁Scrapy - Redis:构建高效分布式爬虫
  • SpringBoot Test详解
  • Maven在Eclipse中的使用指南
  • flink使用demo
  • 前端面试之Flex布局:核心机制与高频考点全解析
  • MySQL MHA 部署全攻略:从零搭建高可用数据库架构
  • 第十章 Kubernetes Ingress
  • Windows使用docker部署fastgpt出现的一些问题
  • PyTorch torch.logsumexp 详解:数学原理、应用场景与性能优化(中英双语)
  • DPVS-2:单臂负载均衡测试
  • Springboot应用开发工具类整理
  • Unity Excel导表工具转Lua文件
  • ios UICollectionView使用自定义UICollectionViewCell
  • 输入框元素覆盖冲突
  • 2024年数学SCI1区TOP:改进海洋捕食者算法MMPA用于UAV路径规划,深度解析+性能实测
  • Python解析 Flink Job 依赖的checkpoint 路径
  • 如何利用网站做产品推广/浏览广告赚佣金的app
  • 溧阳做网站哪家好/他达拉非
  • 做游戏直播那个网站/百度竞价关键词价格查询工具
  • 网站正在建设中代码/无线网络优化
  • 重庆高端网站seo/视频号排名优化帝搜软件
  • 网赌网站国外空间/百度账号登录不了