Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Security工作原理(一)

Spring Security工作原理(一)

作者头像
MickyInvQ
发布于 2024-01-20 02:15:08
发布于 2024-01-20 02:15:08
23200
代码可运行
举报
文章被收录于专栏:InvQ的专栏InvQ的专栏
运行总次数:0
代码可运行

过滤器

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 使用案例

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
	// do something before the rest of the application
    chain.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的伪代码示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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可能不包含任何安全过滤器实例。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的
上一篇主要介绍了Spring Secuirty中的过滤器链SecurityFilterChain是如何配置的,那么在配置完成之后,SecurityFilterChain是如何在应用程序中调用各个Filter,从而起到安全防护的作用,本文主要围绕SecurityFilterChain的工作原理做详细的介绍。
fullstackyang
2024/06/02
5950
Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的
Spring Security(六)—SpringSecurityFilterChain加载流程深度解析
SpringSecurityFilterChain 作为 SpringSecurity 的核心过滤器链在整个认证授权过程中起着举足轻重的地位,每个请求到来,都会经过该过滤器链,前文《Spring Security(四)--核心过滤器源码分析》 中我们分析了 SpringSecurityFilterChain 的构成,但还有很多疑问可能没有解开:
kirito-moe
2018/07/25
8K0
Spring Security(六)—SpringSecurityFilterChain加载流程深度解析
SpringSecurity6 | 委派筛选器代理和过滤器链代理
大家好,我是Leo哥🫣🫣🫣,上一节我们简单回顾了一下关于Servlet原生过滤器以及简单认识了SpringSecurity中的一些过滤器。但是底层SpringSecurity是如何维护这些过滤器,并通过这些过滤器是如果拦截我们的客户端请求的,我们都还只是停留在表层,今天就让我们去深入了解一下我们今天得主角—委派筛选器代理 DelegatingFilterProxy。好了,话不多说让我们开始吧😎😎😎。
程序员Leo
2023/11/16
3790
SpringSecurity6 | 委派筛选器代理和过滤器链代理
Spring Security 实战干货:图解Spring Security的过滤器体系
我在Spring Security 实战干货:内置 Filter 全解析对Spring Security的内置过滤器进行罗列,但是Spring Security真正的过滤器体系才是我们了解它是如何进行"认证"、“授权”、“防止利用漏洞”的关键。
码农小胖哥
2020/07/06
4.2K0
【第三篇】开始和SpringSecurity的简单交往-处理请求的本质
分析SpringSecurity的核心原理,那么我们从哪开始分析?以及我们要分析哪些内容?
用户4919348
2022/05/10
3410
【第三篇】开始和SpringSecurity的简单交往-处理请求的本质
SpringSecurity:高级应用
分析SpringSecurity的核心原理,那么我们从哪开始分析?以及我们要分析哪些内容?
Java鱼头
2022/11/30
8721
SpringSecurity是如何玩弄过滤器链的
本文适合在对SpringSecurity有基本认识,并且会基础使用的,想要进阶研究源码的小伙伴。
大忽悠爱学习
2022/10/06
8800
SpringSecurity是如何玩弄过滤器链的
SpringSecurity6从入门到实战之整合原生Filter链
Spring提供了一个名为DelegatingFilterProxy的过滤器实现,它允许在Servlet容器的生命周期和Spring的ApplicationContext之间架起桥梁。Servlet容器允许使用自己的标准注册过滤器实例,但它不知道Spring定义的Bean。您可以通过标准的Servlet容器机制注册DelegatingFilterProxy,但将所有工作委托给实现过滤器的Spring Bean
全干程序员demo
2024/05/31
4990
SpringSecurity6 | 核心过滤器
大家好,我是Leo哥🫣🫣🫣,上一节我们通过源码剖析以及图文分析,了解了关于委派筛选器代理和过滤器链代理的原理和作用。这节课我们接着学习SpringSecurity的过滤器,了解SpringSecurity中都有哪些核心过滤器。好了,话不多说让我们开始吧😎😎😎。
程序员Leo
2023/11/17
1.5K0
SpringSecurity6 | 核心过滤器
Spring Security过滤器链体系
上面两个疑问的答案就在配置类SpringBootWebSecurityConfiguration中。你可以按照下面这个思维导图去理解这个自动配置:
码农小胖哥
2022/02/11
6420
Spring Security过滤器链体系
源码剖析 Spring Security 的实现原理
Spring Security 是一个轻量级的安全框架,可以和 Spring 项目很好地集成,提供了丰富的身份认证和授权相关的功能,而且还能防止一些常见的网络攻击。
架构狂人
2023/11/22
7740
源码剖析 Spring Security 的实现原理
深入理解 FilterChainProxy【源码篇】
松哥最近也是特别忙,Security 更新慢下来了,但是秉持前面说的,要学就成系列的学,要学就学透彻,这个系列我还会继续更下去。
江南一点雨
2020/07/21
1.9K1
深入理解 FilterChainProxy【源码篇】
Spring Security入门(二) 基于内存存储的表单登录实战
Spring Security 对Servlet的安全认证是基于包含一系列的过滤器对请求进行层层拦截处理实现的,多个过滤器组成过滤器链。处理单个http 请求的过滤链角色示意图如下所示:
用户3587585
2022/09/21
8940
Spring Security入门(二) 基于内存存储的表单登录实战
Spring Security 上
FilterSecurityInterceptor:是一个方法级的 权限过滤器 ,基本位于过滤链的最底部
张小驰出没
2021/05/08
6990
Spring Security  上
Spring Security的过滤器链机制
在“码农小胖哥”的文章中提到一个关键的过滤器链SecurityFilterChain,当一个请求 HttpServletRequest 进入 SecurityFilterChain 时,会通过 matches 方法来确定是否满足条件进入过滤器链,进而决定请求应该执行哪些过滤器。下面我们自己来梳理一遍。
阿提说说
2022/12/02
9710
Spring MVC更多家族成员---框架内处理流程拦截与HandlerInterceptor---08
前面已经讲述了,HandlerMapping返回的用于处理具体Web请求的Handler对象,是通过一个HandlerExecutionChain对象进行封装的(这在HandlerMapping的接口定义上可以看出来)。
大忽悠爱学习
2022/08/23
5950
Spring MVC更多家族成员---框架内处理流程拦截与HandlerInterceptor---08
SpringSecurity6 | 回顾Filter
大家好,我是Leo哥🫣🫣🫣,上一节我们通过一个HelloWorld案例,以代码的方式实现了我们项目添加登录鉴权功能,只是通过一个就轻松实现了这个功能。那么他其中的原理是什么呢,带着疑问,我们后面几节课主要学习一下如何实现这些的原理。好了,话不多说让我们开始吧😎😎😎。
程序员Leo
2023/11/16
3340
SpringSecurity6 | 回顾Filter
【译】Spring 官方教程:Spring Security 架构
原文:Spring Security Architecture 译者:徐靖峰 校对:马超君 专题指南 本文是 Spring Security 的入门指南,并对 Spring Security 的框架设计和基础组件进行深度解析。我们仅涉及应用程序安全性的基础知识,但这已足够消除开发人员在使用 Spring Security 时遇到的一些困惑。要做到这一点,我们需要了解如何使用过滤器和方法注解来保障Web应用程序的安全性。如果你需要了解高级别安全应用程序的工作方式,以及如何定制安全应用程序,或只需要学习如何思考
程序猿DD
2018/03/26
2K0
【译】Spring 官方教程:Spring Security 架构
Spring Security 实战:Spring Boot 下的自动配置
我们在前几篇对 Spring Security 的用户信息管理机制,密码机制进行了探讨。没有看的同学可通过 https://felord.cn 获取。我们发现 Spring Security Starter相关的 Servlet 自动配置都在spring-boot-autoconfigure-2.1.9.RELEASE(当前 Spring Boot 版本为2.1.9.RELEASE) 模块的路径org.springframework.boot.autoconfigure.security.servlet 之下。其实官方提供的Starter组件的自动配置你都能在spring-boot-autoconfigure-2.1.9.RELEASE下找到。今天我们进一步来解密 Spring Security 在 Spring Boot 的配置和使用。
码农小胖哥
2019/12/10
1.6K0
SpringSecurity常用过滤器介绍
  首当其冲的一个过滤器,非常重要 主要是使用SecurityContextRepository在session中保存或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续filter建立所需的上下文,SecurityContext中存储了当前用户的认证和权限信息。
用户4919348
2019/12/11
1.7K0
SpringSecurity常用过滤器介绍
相关推荐
Spring Security 6.x 过滤器链SecurityFilterChain是如何工作的
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档