spring-security 过滤器 (三)

spring-security过滤器

  • 版本信息
  • 过滤器配置
    • 过滤器配置相关类图
    • 过滤器加载过程
      • 创建 HttpSecurity Bean 对象
      • 创建过滤器
  • 过滤器作用
    • ExceptionTranslationFilter
  • 自定义过滤器

本章介绍 spring-security 过滤器配置类 HttpSecurity,过滤器加载过程,自定义过滤器

版本信息

内容版本
JDK17
spring-boot-starter-web3.2.2
spring-boot-starter-security3.2.2
spring-security6.2.1

过滤器配置

过滤器配置相关类图

过滤器链由HttpSecurity的配置类配置生成的,在HttpSecurity.build()的时候添加至过滤器链,主要的配置类如下

org.springframework.security.config.annotation.web.configurers.CsrfConfigurer
org.springframework.security.config.annotation.web.configurers.ExceptionHandlingConfigurer
org.springframework.security.config.annotation.web.configurers.HeadersConfigurer
org.springframework.security.config.annotation.web.configurers.SessionManagementConfigurer
org.springframework.security.config.annotation.web.configurers.SecurityContextConfigurer
org.springframework.security.config.annotation.web.configurers.RequestCacheConfigurer
org.springframework.security.config.annotation.web.configurers.AnonymousConfigurer
org.springframework.security.config.annotation.web.configurers.ServletApiConfigurer
org.springframework.security.config.annotation.web.configurers.LogoutConfigurer
org.springframework.security.config.annotation.web.configurers.CorsConfigurer

在这里插入图片描述

过滤器加载过程

创建 HttpSecurity Bean 对象

  1. SpringBoot 自动装载类 org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
    在这里插入图片描述
  2. @Import 导入 org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration
    在这里插入图片描述
  3. Spring Security 核心注解类 @EnableWebSecurity
    在这里插入图片描述
  4. @Import 导入 org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration
    在这里插入图片描述
  5. HttpSecurityConfiguration 配置类中开始创建 HttpSecurity 的bean 对象
    在这里插入图片描述
    可以在 org.springframework.security.config.annotation.AbstractConfiguredSecurityBuilder#add 方法中加个断点,看初始化添加了多少个配置类
    在这里插入图片描述
    配置类还可以扩展的,基于SPI扩展 org.springframework.security.config.annotation.web.configuration.HttpSecurityConfiguration#applyDefaultConfigurers
    在这里插入图片描述
    从这段代码可以看出,可以自定义过滤器的配置类,对扩展开放√

创建过滤器

  1. Spring Boot 自动装载在之前已分析,直接定位到 org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration, 在这个类中有创建过滤器链的Bean
    在这里插入图片描述
  2. 默认过滤器链编译过程,查看 http.build() 方法
    在这里插入图片描述
    首先判断是否已经构建了,防止重复构建。再执行 doBuild() 方法
    在这里插入图片描述
    在编译的过程中,会读取之前的配置类,将相关的过滤器添加到过滤器链,查看 configure() 方法
    在这里插入图片描述
  3. 在配置类中,创建过滤器类,将过滤器类加载到过滤器链,列举一个配置类org.springframework.security.config.annotation.web.configurers.CsrfConfigurer#configure,其它的配置类和这个相似
    在这里插入图片描述
    将过滤器添加到列表 org.springframework.security.config.annotation.web.builders.HttpSecurity#filters
    在这里插入图片描述
  4. 构建过滤器链,org.springframework.security.config.annotation.web.builders.HttpSecurity#performBuild
    在这里插入图片描述

过滤器作用

ExceptionTranslationFilter

官网介绍 https://docs.spring.io/spring-security/reference/servlet/architecture.html#servlet-exceptiontranslationfilter

在这里插入图片描述
在这里插入图片描述
注意,执行顺序在 ExceptionTranslationFilter 之后的过滤器才会捕获到异常,并进行异常处理。默认过滤器的顺序如图所示,在 ExceptionTranslationFilter 之后的过滤器只有 org.springframework.security.web.access.intercept.AuthorizationFilter,该过滤器抛出的异常可以被异常过滤器捕获到
在这里插入图片描述

自定义过滤器

参考官网 https://docs.spring.io/spring-security/reference/servlet/architecture.html#adding-custom-filter,提示部分的内容挺好的
在这里插入图片描述
根据提示可以定义过滤器代码如下

import jakarta.servlet.FilterChain;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;import java.io.IOException;
import java.nio.file.AccessDeniedException;public class TenantFilter extends OncePerRequestFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain) throws ServletException, IOException {String tenantId = request.getHeader("X-Tenant-Id");boolean hasAccess = isUserAllowed(tenantId);if (hasAccess) {filterChain.doFilter(request, response);return;}throw new AccessDeniedException("Access denied");}private boolean isUserAllowed(String tenantId) {// TODO checkreturn false;}
}

避免过滤器注册到 Tomcat 中,可以参考如下代码
在这里插入图片描述
配置自定义过滤器到过滤器链

@Configuration
public class SecurityConfig {@Beanpublic SecurityFilterChain filterChain(HttpSecurity http) throws Exception {http.addFilterBefore(new TenantFilter(), AuthorizationFilter.class);return http.build();}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/702062.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息抽取(UIE):使用自然语言处理技术提升证券投资决策效率

一、引言 在当今快速变化的证券市场中,信息的价值不言而喻。作为一名资深项目经理,我曾领导一个关键项目,旨在通过先进的信息抽取技术,从海量的文本数据中提取关键事件,如企业并购、新产品发布以及政策环境的变动。这些…

Open CASCADE学习|几何数据结构

在几何引擎内一般把数据分成两类:几何信息与拓扑信息。二者可以完整地表达出实体模型,彼此相互独立、又互相关联。几何信息是指构成几何实体的各几何元素在欧式空间中的位置、大小、尺寸和形状信息。例如一条空间的直线,可以用两端点的位置矢…

[ffmpeg] 获取编译配置信息

背景 想使用 ffmpeg 的 n 卡编码器,发现 find_encode 失败,想看看是不是编译 ffmpeg 的时候有些功能没有打开。 如何获取编译配置信息 api const char* configuration avcodec_configuration(); printf("FFmpeg file configuration: %s\n"…

五种多目标优化算法(MOCS、MOFA、NSWOA、MOAHA、MOPSO)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 多目标优化算法是用于解决具有多个目标函数的优化问题的一类算法。其求解流程通常包括以下几个步骤: 1. 定义问题:首先需要明确问题的目标函数和约束条件。多目标优化问题通常涉及多个目标函数,这些目标函数可能…

【人脸朝向识别与分类预测】基于BP神经网络

课题名称:基于BP神经网络的人脸朝向识别分类 版本日期:2024-02-20 运行方式:直接运行BP0503.m文件 代码获取方式:私信博主或 QQ:491052175 模型描述: 采集到一组人脸朝向不同角度时的图像,图像来自不同…

17.材质和外观

1.图形学中的材质 在图形学中,材质(Material)是用来描述物体外观和表面特性的属性集合。它包含了控制光的反射、折射、吸收以及其他光学效果的信息,从而决定了物体在渲染过程中的外观。 渲染方程中那一项和材质有关? …

c#高级-正则表达式

正则表达式是由普通字符和元字符(特殊符号)组成的文字形式 应用场景 1.用于验证输入的邮箱是否合法。 2.用于验证输入的电话号码是否合法。 3.用于验证输入的身份证号码是否合法。等等 正则表达式常用的限定符总结: 几种常用的正则简写表达式…

[VNCTF2024]-Web:CheckIn解析

查看网页 一款很经典的游戏,而且是用js写的 在调试器里面我们可以看见,如果游戏通关的话,它会进行一系列操作,包括使用console.log(_0x3d9d[0]);输出_0x3d9d[0]到控制台,那我们就直接在点击在控制台求出它的值

架构面试题汇总(一)

目录 系统设计性能优化分布式系统安全性微服务架构数据库设计 系统设计 问题: 在设计高可用的电商系统时,你会考虑哪些关键因素来确保系统的可扩展性? 答案: 水平扩展与垂直扩展:设计系统时应考虑支持通过增加更多服…

C++ //练习 8.9 使用你为8.1.2节(第281页)第一个练习所编写的函数打印一个istringstream对象的内容。

C Primer(第5版) 练习 8.9 练习 8.9 使用你为8.1.2节(第281页)第一个练习所编写的函数打印一个istringstream对象的内容。 环境:Linux Ubuntu(云服务器) 工具:vim 代码块 /*****…

独立版表情包小程序完整版源码前后端源码,附带系统搭建教程

搭建要求: 1.系统要求Nginx 1.18.0PHP-7.2mysql5.6,开启 ssl,php需要安装 sg11 扩展 2.设置伪静态 location / { index index.php index.html index.htm; if (!-e $request_filename) { rewrite ^/(.*)$ /index.php?s$1; } } location /a…

容器镜像详解

1. 镜像组成 一个标准的OCI容器镜像由index, manifest, config, image layers这几个部分组成。 以docker镜像为例,下载的镜像文件保存在/var/lib/docker/目录下面 image/overlay2子目录下面保存着镜像相关的一些元数据 在下面的介绍主要以nginx:latest镜像为例子…

接口自动化测试用例如何设计

说到自动化测试,或者说接口自动化测试,多数人的第一反应是该用什么工具,比如:Python Requests、Java HttpClient、Apifox、MeterSphere、自研的自动化平台等。大家似乎更关注的是哪个工具更优秀,甚至出现“ 做平台的 &…

流计算之Flink

文章目录 概要有界无界流集群JobManagerTaskManagersTasks 和算子链Task Slots 和资源 小结 概要 Apache Flink 是一个框架和分布式处理引擎,用于在无边界和有边界数据流上进行有状态的计算。Flink 能在所有常见集群环境中运行,并能以内存速度和任意规模…

【微服务】mybatis typehandler使用详解

目录 一、前言 二、TypeHandler简介 2.1 什么是TypeHandler 2.1.1 TypeHandler特点 2.2 TypeHandler原理 2.3 mybatis自带的TypeHandler 三、环境准备 3.1 准备一张数据表 3.2 搭建一个springboot工程 3.2.1 基础依赖如下 3.2.2 核心配置文件 3.2.3 测试接口 四、T…

JAVA工程师面试专题-《Mysql》篇

目录 一、基础 1、mysql可以使用多少列创建索引? 2、mysql常用的存储引擎有哪些 3、MySQL 存储引擎,两者区别 4、mysql默认的隔离级别 5、数据库三范式 6、drop、delete 与 truncate 区别? 7、IN与EXISTS的区别 二、索引 1、索引及索…

odoo17彻底删除一个model

Odoo的ORM非常牛逼, 但是有一个缺点,就是删除一个模型的时候, 系统并不会帮我们从数据库中删除,然后重启odoo的时候就会报keyerror, 为了彻底从数据库中删除一个模型的数据,我整理了如下sql脚本&#xff1a…

暴雨服务器让数据中心变“绿”

近年来,随着数字经济的快速发展和信息技术的广泛应用,算力成为社会发展的重要支撑。我国算力总规模近5年年均增速近30%,达到每秒1.97万亿亿次浮点运算,位居全球第二。然而,传统算力方式往往伴随着高能耗、高…

接口测试实战--自动化测试流程

一、项目前期准备 常见项目软件架构: springMvc:tomcat里运行war包(在webapps目录下) springboot:java -jar xx.jar -xms(**) 运行参数 springCloud:k8s部署,使用kubectl create -f xx.yaml 接口自动化测试介入需越早越好,只要api定义好就可以编写自动化脚本; 某个…

PyTorch概述(四)---DataLoader

torch.utils.data.DataLoader是PyTorch数据加载工具的核心;表示一个Python可迭代数据集; DataLoader支持的数据集类型 map-style 和 iterable-style 的数据集;可定制的数据加载顺序;自动批量数据集;单进程和多进程数…