spring-security原理与应用系列:HttpSecurity.filters

news2025/4/26 4:03:08

目录

AnyRequestMatcher

WebSecurityConfig

HttpSecurity

AbstractInterceptUrlConfigurer

AbstractAuthenticationProcessingFilter

类图


        在前面的文章《spring-security原理与应用系列:securityFilterChainBuilders》中,我们遗留了一个问题:HttpSecurity建造者的build()方法最终构建的是DefaultSecurityFilterChain对象,该对象的两个构造参数requestMatcher和filters是如何初始化的呢?

        这篇文章,我们来了解其中跟filters对象相关的流程。       

        设置断点,如下所示:

        在这里, 我们看到requestMatcher对象的类型是AnyRequestMatcher,如下所示:

AnyRequestMatcher

public final class AnyRequestMatcher implements RequestMatcher {
   public static final RequestMatcher INSTANCE = new AnyRequestMatcher();
   public boolean matches(HttpServletRequest request) {
      return true;
   }

        在这里,matches()方法直接返回true,所以自定义配置的请求地址串也就没有放在这里了。

        所以,这个filters列表里所有的过滤器都会执行,这个与核心过滤器的filters对象有较大的区别。

        请求地址的匹配操作会在filters里的每个过滤器都进行一次过滤(除非中间执行过程中有不满足过滤器要求而提前结束HTTP请求)。

        所以,我们重点关注filters的对象即可。

        我们的自定义配置类如下所示:

WebSecurityConfig

@EnableWebSecurity
@EnableGlobalMethodSecurity(securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
   @Autowired
   private SecurityConfig securityConfig;
   @Override
   protected void configure(HttpSecurity http) throws Exception {
      http.authorizeRequests()
            // 配置白名单(比如登录接口)
            .antMatchers(securityConfig.getPermitUrls()).permitAll()
            // 匿名访问的URL,即不用登录也可以访问(比如广告接口)
            .antMatchers(securityConfig.getAnonymousUrls()).permitAll()
            // 买家接口需要 “ROLE_BUYER” 角色权限才能访问
            .antMatchers("/buyer/**").hasRole("BUYER")
            // 其他任何请求满足 rbacService.hasPermission() 方法返回true时,能够访问
            .anyRequest().access("@rbacService.hasPermission(request, authentication)")
          ... ...

   }

        点击authorizeRequests(),如下所示:

HttpSecurity

public ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry authorizeRequests() throws Exception {
   ApplicationContext context = getContext();
   return getOrApply(new ExpressionUrlAuthorizationConfigurer<HttpSecurity>(context))
         .getRegistry();
}

         在这里,将配置器ExpressionUrlAuthorizationConfigurer使用于建造者HttpSecurity中。

        通过前面的章节,我们知道,建造者在建造对象时,会调用配置器的configure()方法,找到配置器ExpressionUrlAuthorizationConfigurer的configure()方法,如下所示:

AbstractInterceptUrlConfigurer

abstract class AbstractInterceptUrlConfigurer<C extends AbstractInterceptUrlConfigurer<C, H>, H extends HttpSecurityBuilder<H>>
      extends AbstractHttpConfigurer<C, H> {
   private Boolean filterSecurityInterceptorOncePerRequest;
   private AccessDecisionManager accessDecisionManager;
   @Override
   public void configure(H http) throws Exception {
      FilterInvocationSecurityMetadataSource metadataSource = createMetadataSource(http);
      if (metadataSource == null) {
         return;
      }
      FilterSecurityInterceptor securityInterceptor = createFilterSecurityInterceptor(
            http, metadataSource, http.getSharedObject(AuthenticationManager.class));
      if (filterSecurityInterceptorOncePerRequest != null) {
         securityInterceptor
               .setObserveOncePerRequest(filterSecurityInterceptorOncePerRequest);
      }
      securityInterceptor = postProcess(securityInterceptor);
      http.addFilter(securityInterceptor);
      http.setSharedObject(FilterSecurityInterceptor.class, securityInterceptor);
   }

        在这里,果不其然,我们看到了往建造者HttpSecurity对象添加过滤器filter的代码http.addFilter(securityInterceptor)。该过滤器的类型是FilterSecurityInterceptor。

        通过上面的分析,我们知道,请求地址的匹配操作会在filters里的每个过滤器都进行一次过滤(除非中间执行过程中有不满足过滤器要求而提前结束HTTP请求的)。

        接下来,我们找一个比较简单的过滤器,了解一下这些过滤器是如何进行请求地址匹配的,如下所示:

AbstractAuthenticationProcessingFilter

public abstract class AbstractAuthenticationProcessingFilter extends GenericFilterBean
      implements ApplicationEventPublisherAware, MessageSourceAware {

... ...

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
      throws IOException, ServletException {
   HttpServletRequest request = (HttpServletRequest) req;
   HttpServletResponse response = (HttpServletResponse) res;
   if (!requiresAuthentication(request, response)) {
      chain.doFilter(request, response);
      return;
   }
   Authentication authResult;
   try {
      authResult = attemptAuthentication(request, response);
      if (authResult == null) {
         return;
      }
      sessionStrategy.onAuthentication(authResult, request, response);
   }
   catch (InternalAuthenticationServiceException failed) {
      unsuccessfulAuthentication(request, response, failed);
      return;
   }
   catch (AuthenticationException failed) {
      unsuccessfulAuthentication(request, response, failed);
      return;
   }
   if (continueChainBeforeSuccessfulAuthentication) {
      chain.doFilter(request, response);
   }
   successfulAuthentication(request, response, chain, authResult);
}

        在这里,通过调用!requiresAuthentication(request, response)判断是否需要对当前请求进行认证,不需要则执行下一个过滤器,需要则进行认证操作。

        点击requiresAuthentication()方法,如下所示:

protected boolean requiresAuthentication(HttpServletRequest request,
      HttpServletResponse response) {
   return requiresAuthenticationRequestMatcher.matches(request);
}

       spring-security还内置了许多的过滤器,如下所示:

       这些过滤器给我们的开发工作带来了你很大的方便,减少了大量的工作,这个后续我们再探究。

        如下是与过滤器FilterSecurityInterceptor相关的类图:

类图

        这里是与过滤器FilterSecurityInterceptor的Configurer相关的类图。

        这里是配置器的属性ExpressionInterceptUrlRegistry相关的类图。

       这里是过滤器FilterSecurityInterceptor相关的类图。这个过滤器比较复杂与比较重要,我们后续再专门开一篇文章进行探究。

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

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

相关文章

JVM生产环境问题定位与解决实战(六):总结篇——问题定位思路与工具选择策略

本文已收录于《JVM生产环境问题定位与解决实战》专栏&#xff0c;完整系列见文末目录 引言 在前五篇文章中&#xff0c;我们深入探讨了JVM生产环境问题定位与解决的实战技巧&#xff0c;从基础的jps、jmap、jstat、jstack、jcmd等工具&#xff0c;到JConsole、VisualVM、MAT的…

并行治理机制对比:Polkadot、Ethereum 与 NEAR

治理是任何去中心化网络的基础。它塑造了社区如何发展、如何为创新提供资金、如何应对挑战以及如何随着时间的推移建立信任。随着 Web3 的不断发展&#xff0c;决定这些生态系统如何做出决策的治理模型也在不断发展。 在最近的一集的【The Decentralized Mic】中, Polkadot 汇…

TDengine tar.gz和docker两种方式安装和卸载

下载地址 3.1.1.0 Linux版本 安装包 下载地址 3.1.1.0 docker 镜像 下载地址 3.1.1.0 Window客户端 1. 将文件上传至服务器后解压 tar -zxvf TDengine-server-3.1.1.0-Linux-x64.tar.gz 2. tar.gz安装 解压文件后&#xff0c;进入相应子目录&#xff0c;执行其中的 install.…

【STM32设计】基于STM32的智能门禁管理系统(指纹+密码+刷卡+蜂鸣器报警)(代码+资料+论文)

本课题为基于单片机的智能门禁系统&#xff0c;整个系统由AS608指纹识别模块&#xff0c;矩阵键盘&#xff0c;STM32F103单片机&#xff0c;OLED液晶&#xff0c;RFID识别模块&#xff0c;继电器&#xff0c;蜂鸣器等构成&#xff0c;在使用时&#xff0c;用户可以录入新的指纹…

java知识梳理(二)

一.lambda表达式 作用&#xff1a;Lambda 表达式在 Java 8 引入&#xff0c;主要用于简化匿名内部类的写法&#xff0c;特别是在函数式编程场景中&#xff0c;比如 函数式接口、流式 API&#xff08;Streams&#xff09;、并发编程等。它让 Java 代码更简洁、可读性更强&#x…

鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染

本文以同层渲染为例&#xff0c;介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下&#xff0c;通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…

AI辅助下基于ArcGIS Pro的SWAT模型全流程高效建模实践与深度进阶应用

目前&#xff0c;流域水资源和水生态问题逐渐成为制约社会经济和环境可持续发展的重要因素。SWAT模型是一种基于物理机制的分布式流域水文与生态模拟模型&#xff0c;能够对流域的水循环过程、污染物迁移等过程进行精细模拟和量化分析。SWAT模型目前广泛应用于流域水文过程研究…

尚语翻译图册翻译|专业图册翻译|北京专业翻译公司推荐|专业文件翻译报价

内容概要 尚语翻译公司聚焦多语种产品图册翻译的竞价推广服务&#xff0c;通过行业垂直化运营构建差异化竞争力。其核心服务覆盖机械制造、医疗器械、电子元件三大领域&#xff0c;依托ISO 17100认证的翻译流程和Trados术语管理系统&#xff0c;实现技术文档的精准转化。为提升…

LeetCode 解题思路 30(Hot 100)

解题思路&#xff1a; 递归参数&#xff1a; 生成括号的对数 n、结果集 result、当前路径 path、左括号数 open、右括号数 close。递归过程&#xff1a; 当当前路径 path 的长度等于 n * 2 时&#xff0c;说明已经生成有效括号&#xff0c;加入结果集。若左括号数小于 n&…

Java EE(18)——网络原理——应用层HTTP协议

一.初识HTTP协议 HTTP(HyperText Transfer Protocol&#xff0c;超文本传输协议)是用于在客户端&#xff08;如浏览器&#xff09;和服务器之间传输超媒体文档&#xff08;如HTML&#xff09;的应用层协议。 HTTP协议发展至今发布了多个版本&#xff0c;其中1.0&#xff0c;1.…

强大而易用的JSON在线处理工具

强大而易用的JSON在线处理工具&#xff1a;程序员的得力助手 在当今的软件开发世界中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已经成为了数据交换的通用语言。无论是前端还是后端开发&#xff0c;我们都经常需要处理、验证和转换JSON数据。今天&a…

Qt笔记----》不同环境程序打包

文章目录 概要1、windows环境下打包qt程序2、linux环境下打包qt程序2.1、程序目录2.2、创建一个空文件夹2.3、添加依赖脚本2.4、打包过程2.4.1、添加程序依赖库2.4.2、添加Qt相关依赖库 概要 qt不同运行环境下打包方式&#xff1a;windows/linux 1、windows环境下打包qt程序 …

企业服务器备份软件,企业服务器备份的方法有哪些?

企业服务器备份需综合考虑数据量、业务连续性要求&#xff08;RTO/RPO&#xff09;、合规性及成本等因素。以下是分场景的工具和方法指南&#xff1a; 一、备份软件推荐 1. 80KM备份软件 80KM备份软件可以进行很复杂的备份方式&#xff0c;也可以内网对内网备份、还能内网的…

html5炫酷图片悬停效果实现详解

html5炫酷图片悬停效果实现详解 这里写目录标题 html5炫酷图片悬停效果实现详解项目介绍技术栈核心功能实现1. 页面布局2. 图片容器样式3. 炫酷悬停效果缩放效果倾斜效果模糊效果旋转效果 4. 悬停文字效果5. 性能优化6. 响应式设计 项目亮点总结 项目介绍 本文将详细介绍如何使…

机器学习的一百个概念(5)数据增强

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

在MCU工程中优化CPU工作效率的几种方法

在嵌入式系统开发中&#xff0c;优化 CPU 工作效率对于提升系统性能、降低功耗、提高实时性至关重要。Keil 作为主流的嵌入式开发工具&#xff0c;提供了多种优化策略&#xff0c;包括 关键字使用、内存管理、字节对齐、算法优化 等。本文将从多个方面介绍如何在 Keil 工程中优…

美团民宿 mtgsig 小程序 mtgsig1.2 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向分析 cp execjs.compile(open(民…

(done) MIT6.824 Lecture 02 - RPC and Threads

知乎专栏&#xff1a;https://zhuanlan.zhihu.com/p/641105196 原视频&#xff1a;https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go&#xff1f…

LayaAir3.3.0-beta.3重磅更新!Spine4.2、2D物理、UI系统、TileMap等全面升级!

正式版推出前&#xff0c;说明3.3的功能还没开发完。所以&#xff0c;又一大波更新来了~ 下面对重点更新进行说明。 Spine的重要更新 3.3.0-beta.3版本开始&#xff0c;新增了Spine 4.2 的运行时库&#xff0c;Spine动画上可以支持物理特性了。例如&#xff0c;下图右侧女孩在启…

【AI学习】机器学习算法

1&#xff0c;线性回归模型&#xff08;Linear Regression&#xff09;:预测连续数值 寻找自变量&#xff08;解释变量&#xff09;与因变量&#xff08;被解释变量&#xff09;之间的线性关联关系&#xff0c;通过构建线性方程来对数据进行拟合和预测。即两个变量之间是一次函…