Spring Security身份验证详细介绍( 三 )


文章插图
ProviderManager Parent介绍
事实上,多个ProviderManager实例可能共享相同的父AuthenticationManager 。这在多个SecurityFilterChain实例具有某些共同身份验证(共享的父类AuthenticationManager)和不同身份验证机制(不同的ProviderManager实例)的场景中有些常见 。

Spring Security身份验证详细介绍

文章插图
多个ProviderManager 同一个Parent 介绍
默认情况下,ProviderManager将尝试从成功的身份验证请求返回的Authentication对象中清除任何敏感凭证信息 。这可以防止密码等信息在HttpSession中保留的时间超过必要时间
当您使用用户对象的缓存(例如,在无状态应用程序中提高性能)时,这可能会导致问题 。如果Authentication包含对缓存中的对象(如UserDetails实例)的引用,并且该引用已删除其凭证,那么将不再能够根据缓存的值进行身份验证 。如果您正在使用缓存,则需要考虑到这一点 。一个明显的解决方案是,首先在缓存实现中或在创建返回的Authentication对象的AuthenticationProvider中复制一个对象 。或者,您可以禁用ProviderManager上的
eraseCredentialsAfterAuthentication属性
AuthenticationProvider多个AuthenticationProviders可以被注入到ProviderManager中 。每个AuthenticationProvider执行特定类型的身份验证 。例如,DaoAuthenticationProvider支持基于用户名/密码的身份验证,而JwtAuthenticationProvider支持验证JWT令牌 。
使用AuthenticationEntryPoint请求凭证AuthenticationEntryPoint用于从客户端发送一个HTTP响应请求凭证 。有时客户端将主动包括凭证,例如请求资源的用户名/密码 。在这些情况下,Spring Security不需要提供从客户端请求凭证的HTTP响应,因为它们已经包含在其中了 。
在其他情况下,客户端将向未被授权访问的资源发出未经身份验证的请求 。在本例中,AuthenticationEntryPoint的实现用于客户端的请求凭证 。AuthenticationEntryPoint实现可能执行重定向到一个登录页面,响应一个WWW-Authenticate头,等等 。
AbstractAuthenticationProcessingFilter
AbstractAuthenticationProcessingFilter被用作验证用户凭据的基本过滤器 。在验证凭证之前,Spring Security通常使用AuthenticationEntryPoint请求凭证 。接下来,AbstractAuthenticationProcessingFilter可以验证提交给它的任何身份验证请求 。
Spring Security身份验证详细介绍

文章插图
Spring Security身份验证详细介绍

文章插图
AbstractAuthenticationProcessingFilter 介绍
①当用户提交他们的凭证时,
AbstractAuthenticationProcessingFilter从HttpServletRequest创建一个Authentication来进行身份验证 。创建的身份验证类型依赖于AbstractAuthenticationProcessingFilter的子类 。例如,UsernamePasswordAuthenticationFilter从HttpServletRequest中提交的用户名和密码创建UsernamePasswordAuthenticationToken 。
②接下来,将Authentication传递给AuthenticationManager进行身份验证 。
③如果身份验证失败,则失败:
  • 清除SecurityContextHolder 。
  • RememberMeServices.loginFail被调用 。请记住我没有配置,这是不允许操作的 。
  • AuthenticationFailureHandler被调用 。
④如果身份验证成功,则成功 。
  • SessionAuthenticationStrategy会在新登录时得到通知 。
  • Authentication在SecurityContextHolder上设置 。稍后,securitycontextpersistencfilter将SecurityContext保存到HttpSession 。
  • RememberMeServices.loginSuccess被调用 。请记住我没有配置,这是不允许操作的 。
  • ApplicationEventPublisher发布一个InteractiveAuthenticationSuccessEvent 。
  • AuthenticationSuccessHandler被调用 。
Username/Password Authentication验证用户身份的最常见方法之一是验证用户名和密码 。因此,Spring Security提供了对使用用户名和密码进行身份验证的全面支持 。
读取用户名和密码
Spring Security提供了以下内置机制来从HttpServletRequest读取用户名和密码:
  • 表单登录
  • 基本身份验证
  • 摘要式身份验证
存储机制
每种受支持的读取用户名和密码的机制都可以利用任何受支持的存储机制: