Spring Security 框架结构知识(持续更新)

2024-06-13 06:08

本文主要是介绍Spring Security 框架结构知识(持续更新),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

概述

Spring Security 是一款安全管理框架,在SpringBoot/SpringCloud环境下可以达成0配置的方式集成,非常方便

大致模型

在这里插入图片描述

DelegatingFilterProxy

Spring提供了一个名为DelegatingFilterProxy的过滤器实现,它允许在Servlet容器的生命周期和Spring的ApplicationContext之间架桥

FilterChainProxy

这是Spring Security提供的过滤器链代理,它被包含在DelegatingFilterProxy过滤器中,在接受请求时会经由FilterChainProxy决定来使用哪一条SecurityFilterChain过滤器链

SecurityFilterChain

这个是由FilterChainProxy代理来决定实例的调用,这样对每一套匹配我们都可以有细致的配置,其中SecurityFilterChain实例下的SecurityFilter一般都是Bean

在过滤器链代理对象中可以有一个或多个过滤器链,在多个过滤器链中一个请求会匹配首个满足匹配条件的过滤器链

默认Chain下的Filter

  • ChannelProcessingFilter:确保web请求通过通道的过滤器
  • ConcurrentSessionFilter:并发会话处理包所需的过滤器,这个过滤器会进行两个操作,一是为每个请求设置最后一次请求事件,二是检索回话信息检查回话是否被标识为已过时,如果过时则会使其失效
  • WebAsyncManagerIntegrationFilter:填充SecurityContext的过滤器
  • SecurityContextPersistenceFilter:请求处理前从SecurityContextRepository获取SecurityContext并在请求结束后清除此SecurityContext
  • HeaderWriterFilter:为请求添加一些头部信息的过滤器
  • CsrfFilter:使用同步器令牌模式应用CSRF保护,开发人员需要确保对任何允许状态更改的请求调用CsrfFilter
  • LogoutFilter:用户退出的过滤器,他会顺序的调用LogoutSuccessHandlerLogoutHandler
  • OAuth2AuthorizationRequestRedirectFilter:此过滤器通过将最终用户的用户代理重定向到授权服务器的授权端点来启动授权代码授予
  • Saml2WebSsoAuthenticationRequestFilter:不知道是什么用
  • X509AuthenticationFilter:支持X509身份验证的过滤器
  • AbstractPreAuthenticatedProcessingFilter:预处理过滤器,对身份验证的预先处理,默认情况下如果认证失败任然会继续下一个过滤器
  • CasAuthenticationFilter:不知道
  • OAuth2LoginAuthenticationFilter:用于OAuth 2.0登录的过滤器实现
  • Saml2WebSsoAuthenticationFilter:不知道
  • UsernamePasswordAuthenticationFilter:处理表单提交的身份验证,默认需要两个参数(username和password)进行身份验证,这个过滤器默认响应于请求/loginURL的请求
  • OpenIDAuthenticationFilter:处理OpenID身份验证请求的过滤器
  • DefaultLoginPageGeneratingFilter:在用户没有配置登录页面时将会插入到过滤器链的过滤器,提供了默认登录页面配置等等
  • DefaultLogoutPageGeneratingFilter:构建一个默认的退出登录页面配置的过滤器
  • DigestAuthenticationFilter:处理摘要身份验证的处理器
  • BearerTokenAuthenticationFilter:认证包含OAuth 2.0承载令牌的请求,此过滤器应该被写入AuthenticationManagerBearerTokenAuthenticationToken能被AuthenticationManager验证
  • BasicAuthenticationFilter:基于Basic的身份验证过滤器
  • RequestCacheAwareFilter:如果缓存了一个与当前请求匹配的请求对象,负责重新构造所缓存的请求,它将会调用配置的RequestCache上的getMatchingRequest (),如果方法返回一个增强的request则会将它交给doFilter(),如果方法返回null将使用原始的请求,过滤器是没有效果的
  • SecurityContextHolderAwareRequestFilter:对请求对象进行包装增强的过滤器,这个过滤器为请求扩展了以下几个方法
    • HttpServletRequest.authenticate(HttpServletResponse):允许用户确定他们是否经过身份验证,如果没有则将用户发送到登录页面
    • HttpServletRequest.login(String, String):允许用户通过AuthenticationManager进行身份验证
    • HttpServletRequest.logout():允许使用配置的LogoutHandler进行注销
    • AsyncContext.start(Runnable):自动的复制从当前线程的SecurityContextHolder找到的SecurityContextRunable线程
  • JaasApiIntegrationFilter:试图获取JAAS Subject并继续作为该Subject运行的过滤器
  • RememberMeAuthenticationFilter:检测SecurityContext中是否没有Authentication对象,如果RememberMeServices有被实现,则将Authentication填充到SecurityContext中,通过过滤器调用RememberMeServicesautoLogin()方法,如果该方法返回一个非空Authentication对象则会把此对象传递给AuthenticationManager
  • AnonymousAuthenticationFilter:检测SecurityContext中是否没有Authentication对象,并在需要时填充一个,默认实现是在没有Authentication对象时创建一个匿名的Authentication对象放入到SecurityContext
  • OAuth2AuthorizationCodeGrantFilter:OAuth 2.0授权代码授予的过滤器,它处理OAuth 2.0授权响应的处理
  • SessionManagementFilter:检测用户自请求开始以来已经通过身份验证,如果已经通过,则调用配置的SessionAuthenticationStrategy来执行任何与会话相关的活动
  • ExceptionTranslationFilter:处理在过滤器链中抛出的任何AccessDeniedExceptionAuthenticationException异常
  • FilterSecurityInterceptor:通过过滤器实现执行HTTP资源的安全处理
  • SwitchUserFilter:切换用户处理过滤器负责用户上下文切换

Security Filters

这个是过滤器链中的具体过滤器,经由SecurityFilterChain来进行注册



Authentication 认证

Spring Security 提供了全面的身份验证功能

以下是基于servlet应用会用到的一些组件

  • SecurityContextHolder:SecurityContextHolder是Spring Security身份验证的地方
  • SecurityContext:是从SecurityContextHolder获取且包含当前已认证用户的Authentication对象信息的组件
  • Authentication:可以被输入到AuthenticationManager中去提供给认证一个用户或则认证当前用户
  • GrantedAuthority:在认证过程中授予主体(用户)的权限组件
  • AuthenticationManager:定义Spring Security的过滤器如何执行身份验证的API
  • ProviderManager:AuthenticationManager最常见的实现
  • AuthenticationProvider:由ProviderManager用于执行特定类型的身份验证
  • Request Credentials with AuthenticationEntryPoint:用于从客户端请求凭据
  • AbstractAuthenticationProcessingFilter:用于身份验证的基本过滤器

SecurityContextHolder

SecurityContextHolderSecurityContext的获取器,他可以获取、创建SecurityContext

默认的情况下SecurityContextHolder是使用一个ThreadLocal来储存这些细节,这就意味着SecurityContextHolder只会在同一线程下的方法中可用,但我们也可以通过设置来改变这个默认模式

SecurityContext

这个SecurityContext是从SecurityContextHolder获取得到的,SecurityContext包含着Authentication认证信息对象

Authentication

这个Authentication主要用于以下两个用途

  1. 作为AuthenticationManager的输入,提供用户所提供的身份验证的凭证,此时用户是未认证的,自然isAuthenticated()false
  2. 代表当前已经认证的用户,当前这个Authentication是可以通过SecurityContext获取得到

这个Authentication主要包含了

  • principal:识别用户,当使用用户名/密码进行身份验证时,这通常是UserDetails的一个实例
  • credentials:通常代表一个密码,在用户通过认证且保证不泄露的情况下通常会被清除掉
  • authorities:赋予用户的权限

GrantedAuthority

GrantedAuthority是给用户赋予的权限,例如角色、范围等

GrantedAuthority可以从Authentication.getAuthorities()方法中获得

AuthenticationManager

AuthenticationManager是定义Spring Security的过滤器如何执行身份验证的API

ProviderManager

ProviderManager是最常用的AuthenticationManager实现方式,ProviderManager代表一个AuthenticationProvider的集合,其中每一个AuthenticationProvider都有机会去决定身份验证是否成功、失败、或则不下决定而交给下游的AuthenticationProvider做决定,如果配置的AuthenticationProvider都不能够作出决定那么将会抛出AuthenticationException异常,代表不能处理这种身份验证
在这里插入图片描述

AuthenticationProvider的集合中,每一个AuthenticationProvider都可以处理不同类型的身份验证,例如第一个处理的是用户名/密码,第二个处理的是SAML,他们互不影响
在这里插入图片描述

我们可以为ProviderManager配置一个父AuthenticationManager,在自身没有可处理的AuthenticationProvider时候,将会去请求这个父AuthenticationProvider管理器,通常这个是一个ProviderManager实例

默认情况下,ProviderManager将尝试从成功的身份验证请求返回的`Authentication`对象中清除任何敏感的凭据(密码)信息,因此会产生一些问题,如果在之后想获取已认证的用户凭证是没有的,对此有两个解决方案
  • 对返回的Authentication进行拷贝加入缓存,保留用户凭着
  • 禁用ProviderManagereraseCredentialsAfterAuthentication属性,保留凭着

AuthenticationProvider

我们可以将多个AuthenticationProvider注入到ProviderManager中,每一个AuthenticationProvider都执行特定类型的认证

AuthenticationEntryPoint

AuthenticationEntryPoint用于发送从客户端请求凭据的HTTP响应

AbstractAuthenticationProcessingFilter

AbstractAuthenticationProcessingFilter是用于验证用户凭证的基本Filter,在认证凭证之前,Spring Security通常使用AuthenticationEntryPoint请求凭证
在这里插入图片描述

大体的执行流程

  1. 当用户提交凭证,这个AbstractAuthenticationProcessingFilter将通过HttpServletRequest创建一个Authentication对象用于身份验证,这个Authentication的类型依赖于AbstractAuthenticationProcessingFilter的子类
  2. Authentication传递给AuthenticationManager进行身份验证
  3. 如果验证失败
    • 这个SecurityContextHolder会被清除
    • RememberMeServices.loginFail将会被调用,如果有配置的话
    • AuthenticationFailureHandler被调用
  4. 如果验证成功
    • SessionAuthenticationStrategy收到新登录的通知
    • 这个Authentication设置在SecurityContextHolder中,随后,SecurityContextPersistenceFilterSecurityContext保存到HttpSession
    • RememberMeServices.loginSuccess将被调用,如果有配置的话
    • ApplicationEventPublisher触发一个InteractiveAuthenticationSuccessEvent事件




用户名/密码认证

用户名/密码是最为常见的身份验证方式,Spring Security为此提供和非常广泛的支持

Spring Security提供了以下内置机制,用于从HttpServletRequest读取用户名和密码

表单登录

Spring Security可以通过表单中的内容获取登录所需的用户名密码,在没有任何配置的情况下是默认打开的,但是如果有任何servlet配置的情况下需要手动指定

protected void configure(HttpSecurity http) {// 配置http.formLogin(withDefaults());
}
对于默认HTML表单提交配置我们需要注意几点:
1.表单应该以post提交方式进行认证
2.表单应该指明username参数为用户名
2.表单应该指明password参数为密码

Authorization 授权

权限对象由一个GrantedAuthority接口表示,权限对象由AuthenticationManager插入到Authentication对象中,然后由AccessDecisionManager s在进行授权决策时读取

这篇关于Spring Security 框架结构知识(持续更新)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Spring AI使用tool Calling和MCP的示例详解

《SpringAI使用toolCalling和MCP的示例详解》SpringAI1.0.0.M6引入ToolCalling与MCP协议,提升AI与工具交互的扩展性与标准化,支持信息检索、行动执行等... 目录深入探索 Spring AI聊天接口示例Function CallingMCPSTDIOSSE结束语

Java获取当前时间String类型和Date类型方式

《Java获取当前时间String类型和Date类型方式》:本文主要介绍Java获取当前时间String类型和Date类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录Java获取当前时间String和Date类型String类型和Date类型输出结果总结Java获取

Spring Boot Actuator应用监控与管理的详细步骤

《SpringBootActuator应用监控与管理的详细步骤》SpringBootActuator是SpringBoot的监控工具,提供健康检查、性能指标、日志管理等核心功能,支持自定义和扩展端... 目录一、 Spring Boot Actuator 概述二、 集成 Spring Boot Actuat

OpenCV在Java中的完整集成指南分享

《OpenCV在Java中的完整集成指南分享》本文详解了在Java中集成OpenCV的方法,涵盖jar包导入、dll配置、JNI路径设置及跨平台兼容性处理,提供了图像处理、特征检测、实时视频分析等应用... 目录1. OpenCV简介与应用领域1.1 OpenCV的诞生与发展1.2 OpenCV的应用领域2

在Java中使用OpenCV实践

《在Java中使用OpenCV实践》用户分享了在Java项目中集成OpenCV4.10.0的实践经验,涵盖库简介、Windows安装、依赖配置及灰度图测试,强调其在图像处理领域的多功能性,并计划后续探... 目录前言一 、OpenCV1.简介2.下载与安装3.目录说明二、在Java项目中使用三 、测试1.测

Spring Bean初始化及@PostConstruc执行顺序示例详解

《SpringBean初始化及@PostConstruc执行顺序示例详解》本文给大家介绍SpringBean初始化及@PostConstruc执行顺序,本文通过实例代码给大家介绍的非常详细,对大家的... 目录1. Bean初始化执行顺序2. 成员变量初始化顺序2.1 普通Java类(非Spring环境)(

Spring Boot 中的默认异常处理机制及执行流程

《SpringBoot中的默认异常处理机制及执行流程》SpringBoot内置BasicErrorController,自动处理异常并生成HTML/JSON响应,支持自定义错误路径、配置及扩展,如... 目录Spring Boot 异常处理机制详解默认错误页面功能自动异常转换机制错误属性配置选项默认错误处理

java如何实现高并发场景下三级缓存的数据一致性

《java如何实现高并发场景下三级缓存的数据一致性》这篇文章主要为大家详细介绍了java如何实现高并发场景下三级缓存的数据一致性,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 下面代码是一个使用Java和Redisson实现的三级缓存服务,主要功能包括:1.缓存结构:本地缓存:使