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

相关文章

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Spring Boot 结合 WxJava 实现文章上传微信公众号草稿箱与群发

《SpringBoot结合WxJava实现文章上传微信公众号草稿箱与群发》本文将详细介绍如何使用SpringBoot框架结合WxJava开发工具包,实现文章上传到微信公众号草稿箱以及群发功能,... 目录一、项目环境准备1.1 开发环境1.2 微信公众号准备二、Spring Boot 项目搭建2.1 创建

Java中Integer128陷阱

《Java中Integer128陷阱》本文主要介绍了Java中Integer与int的区别及装箱拆箱机制,重点指出-128至127范围内的Integer值会复用缓存对象,导致==比较结果为true,下... 目录一、Integer和int的联系1.1 Integer和int的区别1.2 Integer和in

SpringSecurity整合redission序列化问题小结(最新整理)

《SpringSecurity整合redission序列化问题小结(最新整理)》文章详解SpringSecurity整合Redisson时的序列化问题,指出需排除官方Jackson依赖,通过自定义反序... 目录1. 前言2. Redission配置2.1 RedissonProperties2.2 Red

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

JSONArray在Java中的应用操作实例

《JSONArray在Java中的应用操作实例》JSONArray是org.json库用于处理JSON数组的类,可将Java对象(Map/List)转换为JSON格式,提供增删改查等操作,适用于前后端... 目录1. jsONArray定义与功能1.1 JSONArray概念阐释1.1.1 什么是JSONA

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap