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

相关文章

JVM 的类初始化机制

前言 当你在 Java 程序中new对象时,有没有考虑过 JVM 是如何把静态的字节码(byte code)转化为运行时对象的呢,这个问题看似简单,但清楚的同学相信也不会太多,这篇文章首先介绍 JVM 类初始化的机制,然后给出几个易出错的实例来分析,帮助大家更好理解这个知识点。 JVM 将字节码转化为运行时对象分为三个阶段,分别是:loading 、Linking、initialization

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

Security OAuth2 单点登录流程

单点登录(英语:Single sign-on,缩写为 SSO),又译为单一签入,一种对于许多相互关连,但是又是各自独立的软件系统,提供访问控制的属性。当拥有这项属性时,当用户登录时,就可以获取所有系统的访问权限,不用对每个单一系统都逐一登录。这项功能通常是以轻型目录访问协议(LDAP)来实现,在服务器上会将用户信息存储到LDAP数据库中。相同的,单一注销(single sign-off)就是指

浅析Spring Security认证过程

类图 为了方便理解Spring Security认证流程,特意画了如下的类图,包含相关的核心认证类 概述 核心验证器 AuthenticationManager 该对象提供了认证方法的入口,接收一个Authentiaton对象作为参数; public interface AuthenticationManager {Authentication authenticate(Authenti

Spring Security--Architecture Overview

1 核心组件 这一节主要介绍一些在Spring Security中常见且核心的Java类,它们之间的依赖,构建起了整个框架。想要理解整个架构,最起码得对这些类眼熟。 1.1 SecurityContextHolder SecurityContextHolder用于存储安全上下文(security context)的信息。当前操作的用户是谁,该用户是否已经被认证,他拥有哪些角色权限…这些都被保

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

Java架构师知识体认识

源码分析 常用设计模式 Proxy代理模式Factory工厂模式Singleton单例模式Delegate委派模式Strategy策略模式Prototype原型模式Template模板模式 Spring5 beans 接口实例化代理Bean操作 Context Ioc容器设计原理及高级特性Aop设计原理Factorybean与Beanfactory Transaction 声明式事物

Java进阶13讲__第12讲_1/2

多线程、线程池 1.  线程概念 1.1  什么是线程 1.2  线程的好处 2.   创建线程的三种方式 注意事项 2.1  继承Thread类 2.1.1 认识  2.1.2  编码实现  package cn.hdc.oop10.Thread;import org.slf4j.Logger;import org.slf4j.LoggerFactory

poj3468(线段树成段更新模板题)

题意:包括两个操作:1、将[a.b]上的数字加上v;2、查询区间[a,b]上的和 下面的介绍是下解题思路: 首先介绍  lazy-tag思想:用一个变量记录每一个线段树节点的变化值,当这部分线段的一致性被破坏我们就将这个变化值传递给子区间,大大增加了线段树的效率。 比如现在需要对[a,b]区间值进行加c操作,那么就从根节点[1,n]开始调用update函数进行操作,如果刚好执行到一个子节点,