首页 > 其他分享 >SpringSecurity体系结构

SpringSecurity体系结构

时间:2023-04-09 18:03:21浏览次数:45  
标签:Filter FilterChainProxy 请求 Spring SpringSecurity SecurityFilterChain Servlet 体系结

我是通过松哥的博客学习SpringSecurity的,地址是http://itboyhub.com/2021/01/26/spring-security-guide/。对SpringSecurity的使用有了初步的认识。并根据松哥的博客跟了源码,但是每个人的思路不一样,看完之后还有点模糊。对其中的一些用法不够深刻。想了下还是根据自己的思路记录下SpringSecurity。

 
 

体系结构

SpringSecurity是通过Filter来实现一系列功能的。Filter的流程如下:
 


 
客户端向应用程序发送一个请求,容器创建一个FilterChain,其中包含过滤器和Servlet,它们应该根据请求URI的路径处理HttpServlet请求。在Spring MVC应用程序中,Servlet是DispatcherServlet的一个实例。最多一个Servlet可以处理单个HttpServlet请求和HttpServlet响应。

DelegatingFilterProxy

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

DelegatingFilterProxy从ApplicationContext中查找Bean Filter0,然后调用Bean Filter0。
 

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

FilterChainProxy

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

SecurityFilterChain

FilterChainProxy使用SecurityFilterChain来确定应为此请求调用哪些Spring Security Filter。
 

 
SecurityFilterChain中的安全过滤器通常是Beans,但它们是用FilterChainProxy而不是DelegatingFilterProxy注册的。FilterChainProxy为直接向Servlet容器或DelegatingFilterProxy注册提供了许多优势。首先,它为SpringSecurity的Servlet支持提供了一个起点。
 
其次,由于FilterChainProxy是Spring Security使用的核心,它可以执行不被视为可选的任务。例如,它清除SecurityContext以避免内存泄漏。它还应用了Spring Security的HttpFirewall来保护应用程序免受某些类型的攻击。
 
此外,它在确定何时应该调用SecurityFilterChain时提供了更大的灵活性。在Servlet容器中,过滤器仅根据URL调用。然而,FilterChainProxy可以通过利用RequestMatcher接口,根据HttpServlet请求中的任何内容来确定调用。

 

事实上,FilterChainProxy可以用来确定应该使用哪个SecurityFilterChain。这允许为应用程序的不同部分提供完全独立的配置。
 

 

在多重安全过滤器链中,图FilterChainProxy决定应使用哪个安全过滤器链。只有匹配的第一个SecurityFilterChain才会被调用。如果请求/api/messages/的URL,它将首先在SecurityFilterChain0的/api/**模式上匹配,因此只有SecurityFilterChain 0会被调用,即使它在SecurityFilterChainn上也匹配。如果请求了/messages/的URL,那么它将与SecurityFilterChain0的/api/**模式不匹配,因此FilterChainProxy将继续尝试每个SecurityFilterChain。假设没有其他与SecurityFilterChainn匹配的SecurityFilterChain实例将被调用。
 

请注意,SecurityFilterChain0只配置了三个安全筛选器实例。但是,SecurityFilterChainn配置了四个安全筛选器。需要注意的是,每个SecurityFilterChain都可以是唯一的,并且可以单独配置。事实上,如果应用程序希望Spring security忽略某些请求,那么SecurityFilterChain可能没有安全过滤器。

Spring Security Filter

安全过滤器通过SecurityFilterChain API插入到FilterChainProxy中。过滤器的顺序很重要。

 
Spring Security Filter如下:

ForceEagerSessionCreationFilter

ChannelProcessingFilter

WebAsyncManagerIntegrationFilter

SecurityContextPersistenceFilter

HeaderWriterFilter

CorsFilter

CsrfFilter

LogoutFilter

OAuth2AuthorizationRequestRedirectFilter

Saml2WebSsoAuthenticationRequestFilter

X509AuthenticationFilter

AbstractPreAuthenticatedProcessingFilter

CasAuthenticationFilter

OAuth2LoginAuthenticationFilter

Saml2WebSsoAuthenticationFilter

UsernamePasswordAuthenticationFilter

OpenIDAuthenticationFilter

DefaultLoginPageGeneratingFilter

DefaultLogoutPageGeneratingFilter

ConcurrentSessionFilter

DigestAuthenticationFilter

BearerTokenAuthenticationFilter

BasicAuthenticationFilter

RequestCacheAwareFilter

SecurityContextHolderAwareRequestFilter

JaasApiIntegrationFilter

RememberMeAuthenticationFilter

AnonymousAuthenticationFilter

OAuth2AuthorizationCodeGrantFilter

SessionManagementFilter

ExceptionTranslationFilter

FilterSecurityInterceptor

SwitchUserFilter

处理Security异常

ExceptionTranslationFilter允许将AccessDeniedException和AuthenticationException转换为HTTP响应。
 
ExceptionTranslationFilter作为安全筛选器之一插入到FilterChainProxy中。
 

 

1、首先,ExceptionTranslationFilter调用FilterChain.doFilter(请求,响应)来调用应用程序的其余部分。
2、如果用户未通过身份验证或是AuthenticationException,则启动身份验证。将会
a、清除 SecurityContextHolder,
b、保存HttpServlet请求,以便在身份验证成功后可以使用它来重播原始请求。
c、AuthenticationEntryPoint用于向客户端请求凭据。例如,它可能重定向到登录页面或发送WWW-Authenticate标头。
3、否则,如果是AccessDeniedException,则为Access Denied。调用AccessDeniedHandler来处理被拒绝的访问

在身份验证之间保存请求

如“处理安全异常”中所示,当请求没有身份验证并且是针对需要身份验证的资源时,需要保存针对已验证资源的请求,以便在身份验证成功后重新请求。在Spring Security中,这是通过使用RequestCache实现保存HttpServlet请求来完成的。
 
HttpServlet请求保存在RequestCache中。当用户成功进行身份验证时,RequestCache将用于重播原始请求。RequestCacheAwareFilter使用RequestCache来保存HttpServlet请求。默认情况下,会使用HttpSessionRequestCache

标签:Filter,FilterChainProxy,请求,Spring,SpringSecurity,SecurityFilterChain,Servlet,体系结
From: https://www.cnblogs.com/shigongp/p/17300500.html

相关文章

  • SpringSecurity实现权限系统设计
    RBAC权限分析RBAC全称为基于角色的权限控制,本段将会从什么是RBAC,模型分类,什么是权限,用户组的使用,实例分析等几个方面阐述RBAC思维导图绘制思维导图如下什么是RBACRBAC全称为用户角色权限控制,通过角色关联用户,角色关联权限,这种方式,间阶的赋予用户的权限,如下图所示对于通常的系统而......
  • 创建SpringSecurity项目
    一.搭建SpringBoot开发环境我们的SpringSecurity系列教程会基于SpringBoot环境,并且以案例迭代的方式进行开发,所以为了方便后续案例的编写,我们先提前搭建一个SpringBoot环境的Web项目。1.创建SpringBoot项目如各位对SpringBoot基础不熟悉,请参考本人的SpringBoot系列教程:blo......
  • 项目一众筹网07_01_SpringSecurity框架简介和用法、SpringSecurity负责的是 权限验证
    项目一众筹网07_01_SpringSecurity文章目录项目一众筹网07_01_SpringSecurity01简介SpringSecurity负责的是权限验证02-SpringSecurity简介03-Spring的注解模式maven引入Spring环境04-准备测试环境05-加入SpringSecurity环境06-实验1-放行首页和静态资源(下一篇)01简介现在主流的权......
  • 项目一众筹网09_00_SpringSecurity
    系列文章目录提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加例如:第一章Python机器学习入门之pandas的使用提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这......
  • [软件体系结构/架构]零拷贝技术(Zero-copy)[转发]
    0前言近期遇到难题:1个大数据集的查询导出API,因从数据库查询后占用内存极大,每次调用将消耗近100MB的JVM内存资源。故现需考虑研究和应用零拷贝技术。如下全文摘自:看一......
  • 软件体系结构 章一
    章一 1)计算机系统:适当地组织在一起的一系列系统元素的集合,这些系统元素相互配合、相互协作,通过对信息的处理而完成预先定义的目标。系统元素有:计算机软件、计算机硬件、人......
  • 章二 软件体系结构的构建模式(1)
     章二 软件体系结构的构建模式一个设计良好的通用模式往往是这个工程领域技术成熟的标志。1、管道过滤模式1)概述:每个功能模块都有一组输入和输出;功能模块对输入数据流进......
  • 章二 软件体系结构的构建模式(3)
    章二软件体系结构的构建模式(3)一、知识库模式1、知识库模式特征采用知识库模式构建的系统通常有两个截然不同的功能构件: (1)中央数据单元构件:代表系统当前的各种状态; (2)一......
  • 章三 软件体系结构组态分析与应用(2)
    章三软件体系结构组态分析与应用(2)1、JBoss应用服务器JBoss是一个开放源代码的应用服务器,符合J2EE规范。它提供了基于JMX(JavaManagementExtension)体系的EJB容器--JBossSe......
  • 章三 软件体系结构组态分析与应用
    章二软件体系结构的构建模式(4)一、过程控制环模式1、概述所谓对一个对象(或过程)进行控制,意味着设法使这个被控对象(或被控过程)的功能或特性有效的达到所期望的预期目标。为了......