Spring Security工作原理(一)

过滤器

Spring Security的Servlet支持是基于Servlet过滤器的,因此首先了解过滤器的一般作用是很有帮助的。下图显示了单个HTTP请求处理程序的典型分层结构。

在这里插入图片描述
处理客户端发送的请求时,容器创建一个FilterChain,其中包含Filter实例和Servlet,根据请求URI的路径处理HttpServletRequest。在Spring MVC应用程序中,Servlet是DispatcherServlet的一个实例。最多一个Servlet可以处理单个HttpServletRequest和HttpServletResponse。然而,可以使用多个过滤器来:

  • 防止调用下游的Filter实例或Servlet。在这种情况下,Filter通常会编写HttpServletResponse。
  • 修改下游Filter实例和Servlet使用的HttpServletRequest或HttpServletResponse。

Filter 的功能,在于FilterChain 里面的filter。

FilterChain 使用案例

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {// do something before the rest of the applicationchain.doFilter(request, response); // invoke the rest of the application// do something after the rest of the application
}

由于过滤器仅影响下游过滤器实例和Servlet,因此调用每个过滤器的顺序非常重要。

DelegatingFilterProxy

Spring提供了一个名为DelegatingFilterProxy的Filter实现,它允许在Servlet容器的生命周期和Spring的ApplicationContext之间进行桥接。Servlet容器允许使用其自己的标准注册Filter实例,但它不知道Spring定义的Bean。您可以通过标准的Servlet容器机制注册DelegatingFilterProxy,但将所有工作委托给实现Filter的Spring Bean。

这是DelegatingFilterProxy如何适配到Filter实例和FilterChain的图片。
在这里插入图片描述

DelegatingFilterProxy会从ApplicationContext中查找名为Filter0的Bean,然后调用Filter0 Bean。以下是DelegatingFilterProxy的伪代码示例:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {Filter delegate = getFilterBean(someBeanName);delegate.doFilter(request, response);
}
  1. DelegatingFilterProxy延迟获取作为Spring Bean注册的Filter。在DelegatingFilterProxy示例中,delegate是Bean Filter0的一个实例。
  2. 将工作委托给Spring Bean。

DelegatingFilterProxy的另一个好处是它允许延迟查找Filter bean实例。这很重要,因为容器在启动之前需要注册Filter实例。然而,Spring通常使用ContextLoaderListener来加载Spring Beans,这个过程直到Filter实例需要被注册之后才会完成。

FilterChainProxy

Spring Security的Servlet支持包含在FilterChainProxy中。FilterChainProxy是Spring Security提供的特殊Filter,它通过SecurityFilterChain允许委派给许多Filter实例。由于FilterChainProxy是一个Bean,通常会被包装在DelegatingFilterProxy中。

在这里插入图片描述

SecurityFilterChain

SecurityFilterChain被FilterChainProxy用来确定当前请求应该调用哪些Spring Security过滤器实例。

以下图片展示了SecurityFilterChain的作用。

在这里插入图片描述

SecurityFilterChain中的安全过滤器通常是Bean,但它们是注册到FilterChainProxy而不是DelegatingFilterProxy。FilterChainProxy相比直接注册到Servlet容器或DelegatingFilterProxy,提供了许多优势。首先,它为Spring Security的所有Servlet支持提供了一个起点。因此,如果您尝试解决Spring Security的Servlet支持问题,在FilterChainProxy中设置一个调试点是一个很好的起点。

第二,由于FilterChainProxy在Spring Security的使用中是至关重要的,它可以执行一些被视为非可选的任务。例如,它清除SecurityContext以避免内存泄漏。它还应用了Spring Security的HttpFirewall来保护应用程序免受某些类型的攻击。

此外,它在确定何时应调用SecurityFilterChain时提供了更多的灵活性。在Servlet容器中,过滤器实例仅根据URL调用。然而,FilterChainProxy可以通过使用RequestMatcher接口根据HttpServletRequest中的任何内容来确定调用。

以下图片显示了多个SecurityFilterChain实例。
在这里插入图片描述

在多个SecurityFilterChain图中,FilterChainProxy决定使用哪个SecurityFilterChain。只有第一个匹配的SecurityFilterChain会被调用。如果请求的URL是/api/messages/,它首先匹配SecurityFilterChain-0的模式/api/,所以只有SecurityFilterChain0被调用,即使它也匹配SecurityFilterChain-n。如果请求的URL是/messages/,它不匹配SecurityFilterChain-0的模式/api/,所以FilterChainProxy会继续尝试每个SecurityFilterChain。假设没有其他SecurityFilterChain实例匹配,那么SecurityFilterChain-n会被调用。

请注意,SecurityFilterChain-0只配置了三个安全过滤器实例。然而,SecurityFilterChain-n配置了四个安全过滤器实例。重要的是要注意,每个SecurityFilterChain都可以是独特的,并且可以独立配置。实际上,如果应用程序希望Spring Security忽略某些请求,SecurityFilterChain可能不包含任何安全过滤器实例。

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

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

相关文章

【C++】:STL序列式容器list源码剖析

一、list概述 总的来说:环形双向链表 特点: 底层是使用链表实现的,支持双向顺序访问 在list中任何位置进行插入和删除的速度都很快 不支持随机访问,为了访问一个元素,必须遍历整个容器 与其他容器相比,额外…

基于Python的Climate Indices库计算SPEI(标准化降水蒸散发指数)05—栅格SPEI的计算

热闹的尽头是孤寂,在虚浮的欢闹中保持自己,纷繁世间,可报期望者不过二三。 文章目录 前言1. 概述2.1 目的2.2 说明 2. 版本2.1 天津,2024年1月18日,Version1 3. 微信公众号GISRSGeography 一、数据1. 输入数据2. 输出…

MySQL---经典SQL练习题

MySQL---经典50道练习题 素材:练习题目:解题: 素材: 1.学生表 Student(SId,Sname,Sage,Ssex) SId 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 2.课程表 Course(CId,Cname,TId) CId 课程编号,Cname 课程名称,TId 教师编号 3.教师表 Teacher(T…

Spring重要知识点

一、Spring中相关概念 1.IOC 控制反转 IoC(Inverse of Control:控制反转)是⼀种设计思想,就是将原本在程序中⼿动创建对象的控制权,交由Spring框架来管理。IoC 在其他语⾔中也有应⽤,并⾮ Spring 所独有。 IoC 容器…

ADSelfService Plus 推出离线多因素身份验证以提升远程工作安全性

采用先进验证方法,确保在任何时间、地点或连接问题下对业务数据的合法访问即使远程用户未连接到身份验证服务器或互联网,也可通过MFA安全认证。 MFA 得克萨斯州德尔瓦雷 — 2023年5月3日 — Zoho Corporation 旗下的企业IT管理部门ManageEngine今日宣布…

加速电压对扫描电子显微镜成像的影响

扫描电子显微镜(SEM)是一种利用聚焦电子束扫描样品表面,通过激发和收集二次电子、特征X射线等信号,获得样品表面形貌和成分信息的分析仪器。在SEM成像过程中,加速电压是一个关键参数,对成像效果具有重要影响…

WordPress回收站自动清空时间?如何关闭回收站或设置自动清理天数?

我们在WordPress后台的文章、页面、评论等页面都可以看到有回收站,意思就是我们不能直接删除某篇文章、页面、评论,而是需要现将它们移至回收站,然后再到回收站永久删除,或等回收站自动清理。 如上图所示,WordPress 6.…

2023 总结对AI的总结和展望

回顾ChatGPT最初 今天是AI最火的一年,从年初的时候OpenAI一下子火起来了,大家都在测试ChatGPT的智力如何,能力如何,各种视频铺天盖地的。各种测评视频大量散布在网络上面,一开始我只是认为他只是一个聊天小助手比较智能…

【Docker】在centos中安装nginx

🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《【Docker】安装nginx》。🎯&#…

2024-01-18 在Android Studio中,可以通过修改build.gradle文件(位于你的应用模块目录下)来自定义生成的APK名称

一、在Android Studio中,可以通过修改build.gradle文件(位于你的应用模块目录下)来自定义生成的APK名称,在build.gradle里面增加下面的代码 applicationVariants.all { variant ->variant.outputs.all {outputFileName "…

5-数组-矩阵置零

这是数组的第5篇算法,力扣链接。 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1: 输入:matrix [[1,1,1],[1,0,1],[1,1,1]] 输出:[[1,0,1],[0…

O(1) 时间插入、删除和获取随机元素

题目链接 O(1) 时间插入、删除和获取随机元素 题目描述 注意点 在调用 getRandom 方法时,数据结构中 至少存在一个 元素满足每个函数的 平均 时间复杂度为 O(1) 解答思路 因为要满足满足每个函数的平均时间复杂度为 O(1),只使用List新增和删除的时间…