首页 > 其他分享 >架构

架构

时间:2024-04-19 17:00:26浏览次数:30  
标签:SecurityFilterChain FilterChainProxy 架构 Spring Filter Security Servlet

我们以Spring Security中Servlet实现方式来介绍Spring Security整体架构,不会具体到具体的认证、授权来介绍Spring Security架构。如果让我们自己来写一个安全框架,我们需要将我们的框架置于项目中的哪个位置?很显然是在所有的请求到达Controller之前,在访问具体的某个Controller之前,对请求进行认证、授权、安全验证。在JakartaEE(JavaEE的新版)规范中,Filter和Servlet都符合这个前置要求。在Spring MVC中基本上只包含一个DispatcherServelt主要用于请求分发,缺乏安全相关的支持和合适的扩展机制。我们看Spring Security官方文档中的图来理解:

客户端向应用程序发送一个请求,容器创建一个 FilterChain,其中包含 Filter 实例和 Servlet,应该根据请求URI的路径来处理 HttpServletRequest。在Spring MVC应用程序中,Servlet是 DispatcherServlet 的一个实例。一个 Servlet 最多可以处理一个 HttpServletRequestHttpServletResponse。然而,可以使用多个 Filter 来完成如下工作。本质上,Spring Security的实现原理很简单,就是提供了一个用于安全验证的Filter链

DelegatingFilterProxy

Spring 提供了一个名为 DelegatingFilterProxyFilter 实现,它在Spring Security中起到了一个重要的桥梁作用,连接了Servlet容器和Spring容器。Servlet容器不了解Spring定义的Beans,而Spring Security的大部分组件及其依赖都是注册到Spring容器中的Bean。DelegatingFilterProxy核心代码的主要工作就是从WebApplicationContext获取指定名称的Filter Bean,然后委托给这个Bean的doFilter方法。

DelegatingFilterProxyApplicationContext 查找 Bean Filter0,然后调用 Bean Filter0。下面是Spring Security提供的一段伪代码,快要帮助我们理解:

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

FilterChainProxy

被委托的类型就是FilterChainProxy,FilterChainProxy 是 Spring Security 提供的一个特殊的 Filter,允许通过 SecurityFilterChain 委托给许多 Filter 实例。由于 FilterChainProxy 是一个Bean,它通常被包裹在 DelegatingFilterProxy 中。FilterChainProxy主要作用就是查找匹配当前Http请求规则的SecurityFilterChain,然后将工作委派给SecurityFilterChain的所有Filter。

SecurityFilterChain

SecurityFilterChainFilterChainProxy 用来确定当前请求应该调用哪些 Spring Security Filter 实例。

SecurityFilterChain 中的 Security Filter 通常是Bean,但它们是用 FilterChainProxy 而不是 DelegatingFilterProxy注册的。与直接向Servlet容器或 DelegatingFilterProxy 注册相比,FilterChainProxy 有很多优势。首先,它为 Spring Security 的所有 Servlet 支持提供了一个起点。由于这个原因,如果你试图对 Spring Security 的 Servlet 支持进行故障诊断,在 FilterChainProxy 中添加一个调试点是一个很好的开始。

其次,由于 FilterChainProxy 是 Spring Security 使用的核心,它可以执行一些不被视为可有可无的任务。 例如,它清除了 SecurityContext 以避免内存泄漏。它还应用Spring Security的 HttpFirewall来保护应用程序免受某些类型的攻击。

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

Multiple SecurityFilterChain图中, FilterChainProxy 决定应该使用哪个 SecurityFilterChain。只有第一个匹配的 SecurityFilterChain 被调用。如果请求的URL是 /api/messages/,它首先与 /api/**SecurityFilterChain0 模式匹配,所以只有 SecurityFilterChain0 被调用,尽管它也与 SecurityFilterChainn 匹配。如果请求的URL是 /messages/,它与 /api/**SecurityFilterChain0 模式不匹配,所以 FilterChainProxy 继续尝试每个 SecurityFilterChain。假设没有其他 SecurityFilterChain 实例相匹配,则调用 SecurityFilterChainn

请注意,SecurityFilterChain0 只配置了三个 security Filter 实例。然而,SecurityFilterChainn 却配置了四个 security Filter 实例。值得注意的是,每个 SecurityFilterChain 都可以是唯一的,并且可以单独配置。事实上,如果应用程序希望 Spring Security 忽略某些请求,那么一个 SecurityFilterChain 可能会有零个 security Filter 实例。

Security Filter

Security Filter 是通过 SecurityFilterChainAPI 插入 [FilterChainProxy中的。

这些 filter 可以用于许多不同的目的,如 认证授权漏洞保护 等等。filter 是按照特定的顺序执行的,以保证它们在正确的时间被调用,例如,执行认证的 Filter 应该在执行授权的 Filter 之前被调用。一般来说,没有必要知道 Spring Security 的 Filter 的顺序。但是,有些时候知道顺序是有好处的,如果你想知道它们,可以查看 FilterOrderRegistration 代码。

源码分析



通过DefaultSecurityFilterChain可以看到,默认情况下会引入16个Filter。比如:UsernamePasswordAuthenticationFilter支持Form表单形式的身份验证模块。

标签:SecurityFilterChain,FilterChainProxy,架构,Spring,Filter,Security,Servlet
From: https://www.cnblogs.com/wyzstudy/p/18146411

相关文章

  • RAG 2.0架构详解:构建端到端检索增强生成系统
    关于检索增强生成(RAG)的文章已经有很多了,如果我们能创建出可训练的检索器,或者说整个RAG可以像微调大型语言模型(LLM)那样定制化的话,那肯定能够获得更好的结果。但是当前RAG的问题在于各个子模块之间并没有完全协调,就像一个缝合怪一样,虽然能够工作但各部分并不和谐,所以我们这里介绍RAG......
  • 【云原生|K8s系列第1篇】:K8s的基础概念、组件架构及实战安装
    1、先从K8s不是什么讲起首先,K8s并不是一个传统意义上的PaaS平台即服务的工具,它充分给使用者提供了很多很多选择的空间。不限制支持的应用程序类型,K8s并不插手应用程序框架,也不限制支持的语言(如Java,Python,Ruby等),只要应用符合12因素即可。也就是说,只需要应用可以在......
  • 问AI关于软件工程师到架构师的升级条件
    初级、中级、高级软件工程师的分类通常依据其技术能力、工作经验、业务理解、项目贡献、团队协作等多个维度。以下是对这三个阶段工程师在知识掌握程度上的大致划分: 初级软件工程师(JuniorSoftwareEngineer)1.基础知识扎实:  -熟练掌握至少一门编程语言(如Java、Python、C+......
  • “趣”学架构
    搭系统先搭架子对于多个业务需求,都有打印入参、检验入参、业务逻辑、打印出参、处理异常的流程。方法1:做业务逻辑的聚类但内容经常不同,很难去做大范围的聚类方法2:模版方法模式用抽象类做约束,必须实现这些接口伪代码 弊端业务需求会导致代码经常多一个功能,改一个功能,......
  • 京东内部研效架构师训练营,首次对外公开课,不可错过的研效之旅!
    五月繁花似锦,让我们带你走进京东,开启研效实战之旅! 四大单位联合发起本次活动由“全国云计算技术行业产教融合共同体”发起,联合工业和信息化部电子第五研究所、E³CI软件研发效能度量工作委员会、京东云共同主办,重磅推出“卓越研效架构师”研习营,邀请30名企业研发核心管理者......
  • 微服务架构下如何通过弱依赖原则保障系统高可用
    前言当我初次接触高可用这个概念的时候,对高可用的【少依赖原则】和【弱依赖原则】的边界感模糊,甚至有些“傻傻分不清楚”。这两个原则都关注降低模块之间的依赖关系,但它们之间的确存在某些差异。那么,「少依赖原则」和「弱依赖原则」它们之间本质的区别究竟是啥?少依赖原则和弱......
  • 长连接网关技术专题(十一):揭秘腾讯公网TGW网关系统的技术架构演进
    本文由腾讯技术团队peter分享,原题“腾讯网关TGW架构演进之路”,下文进行了排版和内容优化等。1、引言TGW全称TencentGateway,是一套实现多网统一接入,支持自动负载均衡的系统,是公司有10+年历史的网关,因此TGW也被称为公司公网的桥头堡。本文从腾讯公网TGW网关系统的应用场景、......
  • 基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发秒杀系统——与京东淘宝同
    ​介绍基于K8s+Docker+Openresty+Lua+SpringCloudAlibaba的高并发高性能商品秒杀系统,本系统实测单台(16核32G主频2.2GHz)openresty(nginx)的QPS可高达6w并发,如果您需要应对100w的并发,则需要100w/6w=17台openresty服务器,17台服务器同时接收并处理这100w的并发流量呢?当然是商业......
  • 软件体系架构课堂测试07 –逻辑架构设计
    某大银行的一位银行卡办公室的收账经理Liz遇到了一个问题。她每周都收到一份过期未付款的账户名单。这份报告已经从两年前的250个账户增加到现在的1250个账户。为了确定那些严重拖欠债务的账户,Liz需要通读这份报告。严重拖欠债务的账户由几个不同的规则确定,每个规则都要求Liz检查......
  • 软件体系架构课堂测试07 –逻辑架构设计
    班级:   学号:    姓名:某大银行的一位银行卡办公室的收账经理Liz遇到了一个问题。她每周都收到一份过期未付款的账户名单。这份报告已经从两年前的250个账户增加到现在的1250个账户。为了确定那些严重拖欠债务的账户,Liz需要通读这份报告。严重拖欠债务的账户由几个不同......