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在进行授权决策时读取

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Security 是一个基于 Spring 的安全框架,它提供了完善的安全控制功能,可以保护 Web 应用程序中的 URL、方法和资源,可以进行认证、授权、防止攻击等操作。 Spring Security 的主要知识点包括: 1. 认证(Authentication):认证是指验证用户身份的过程。Spring Security 支持多种认证方式,包括基本认证、表单认证、OAuth2 认证等。 2. 授权(Authorization):授权是指决定用户是否有权限访问某个资源的过程。Spring Security 支持基于角色、权限、表达式等多种授权方式。 3. 过滤器链(Filter Chain):Spring Security 的安全过滤器链是由多个过滤器组成的,每个过滤器都负责一个特定的安全任务,比如用户认证、授权等。过滤器链可以通过配置来自定义和扩展。 4. 安全表达式(Security Expression):Spring Security 支持使用表达式来控制安全访问。表达式可以用于授权决策、方法级别安全、页面级别安全等。 5. CSRF 防护(CSRF Protection):CSRF(Cross-Site Request Forgery)攻击是一种常见的 Web 攻击方式。Spring Security 提供了多种方式来防止 CSRF 攻击。 6. 异常处理(Exception Handling):Spring Security 在安全处理过程中可能会抛出多种异常,比如认证失败异常、授权异常等。可以通过配置来自定义和处理这些异常。 7. Remember-Me 认证(Remember-Me Authentication):Remember-Me 认证可以让用户在下次访问应用程序时自动登录,避免了每次都需要输入用户名和密码的麻烦。 8. Session 管理(Session Management):Spring Security 支持对用户 Session 的管理,包括 Session 超时、Session 并发控制等。 总体来说,Spring Security 是一个功能强大的安全框架,可以应用于各种 Web 应用程序中,并提供了丰富的安全控制功能和扩展点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值