Spring Security:Authentication 认证(一)

2021-02-03 01:17

阅读:791

  GrantedAuthority 可以从该 Authentication.getAuthorities() 方法获得。此方法提供了一个 GrantedAuthority 集合对象。GrantedAuthority 是授予某个主体的权限。此类权限通常是“角色”,例如 ROLE_ADMINISTRATOR 或 ROLE_HR_SUPERVISOR 。稍后将这些角色配置为 Web授权,方法授权和域对象授权。Spring Security 的其他部分能够解释这些权限,并希望它们存在。使用基于用户名/密码的身份验证时GrantedAuthority,通常会由加载 UserDetailsService 。

  通常,GrantedAuthority 对象是应用程序范围的权限。它们不特定于给定的域对象。因此,您不可能 GrantedAuthority 代表 Employee 54号对象的权限,因为如果有成千上万个这样的权限,这将很快用完内存(或者至少导致应用程序花费很长时间来完成验证用户身份)。当然,Spring Security是专门为满足这一通用要求而设计的,但你可以为此目的使用项目的域对象安全性功能。

  

  ⑤ AuthenticationManager 认证管理器

   AuthenticationManager 定义 Spring Security 的过滤器是如何执行身份验证的 API 。然后再由调用 AuthenticationManager 的控制器(即 Spring Security 的 Filters)在SecurityContextHolder 上设置返回的Authentication。如果您不与Spring Security的过滤器集成,则可以直接设置 SecurityContextHolder,并且不需要使用 AuthenticationManager。

尽管的实现 AuthenticationManager 可以是任何对象,但最常见的实现是 ProviderManager

 

  ⑥ ProviderManager 

  ProviderManager 是 AuthenticationManager 的最常见实现。ProviderManager 委托给 AuthenticationProvider 列表。 每个 AuthenticationProvider 都有机会指示认证应该成功,失败,或者表明它不能做出决定并允许下游 AuthenticationProvider 进行决定。 如果没有配置的 AuthenticationProviders 可以进行身份验证,则身份验证将失败,并显示ProviderNotFoundException,这是一个特殊的 AuthenticationException,它指示未配置 ProviderManager 支持传递给它的身份验证类型。

技术图片

 

  实际上,每个 AuthenticationProvider 都知道如何执行特定类型的身份验证。 例如,一个 AuthenticationProvider 可能能够验证用户名/密码,而另一个可能能够验证 SAML 断言。 这允许每个 AuthenticationProvider 进行非常特定类型的身份验证,同时支持多种类型的身份验证,并且仅公开一个单例 AuthenticationManager bean。

  ProviderManager 还允许配置可选的父类 AuthenticationManager,如果没有 AuthenticationProvider 可以执行身份验证,请咨询该父对象。 父级可以是任何类型的AuthenticationManager,但通常是 ProviderManager的实例。

技术图片

  实际上,多个 ProviderManager 实例可能共享同一个父类 AuthenticationManager。 在存在多个具有相同身份验证(共享的父类 AuthenticationManager)但又具有不同身份验证机制(不同 ProviderManager 实例)的多个 SecurityFilterChain 实例的情况下,这种情况有些常见。

技术图片

 

  默认情况下,ProviderManager 会尝试清除身份验证对象中所有敏感的凭据信息,这些信息将由成功的身份验证请求返回。 这样可以防止密码之类的信息在 HttpSession 中的保留时间超过所需的时间。

  例如,在使用用户对象的缓存来提高无状态应用程序的性能时,这可能会导致问题。 如果身份验证包含对缓存中某个对象(例如 UserDetails 实例)的引用,并且已删除其凭据,则将无法再对缓存的值进行身份验证。 如果使用缓存,则需要考虑到这一点。 一个明显的解决方案是首先在缓存实现中或在创建返回的 Authentication 对象的 AuthenticationProvider 中创建对象的副本。 或者,你可以在 ProviderManager 上禁用 deleteCredentialsAfterAuthentication 属性。

 

  ⑦ AuthenticationProvider

  可以将多个 AuthenticationProvider 注入 ProviderManager。 每个 AuthenticationProvider 执行特定类型的身份验证。 例如,DaoAuthenticationProvider 支持基于用户名/密码的身份验证,而 JwtAuthenticationProvider 支持对JWT令牌的身份验证。AuthenticationEntryPoint

 

  ⑧ 使用 AuthenticationEntryPoint 的请求凭据

  AuthenticationEntryPoint 用于发送请求凭据响应,以回应客户端 HTTP 认证有时,客户端会主动包含凭据(例如用户名/密码)以请求资源。 在这些情况下,Spring Security 不需要提供 HTTP 响应来从客户端请求凭据,因为它们已经包含在内。

  在其他情况下,客户端将对未经授权访问的资源发出未经身份验证的请求。 在这种情况下,AuthenticationEntryPoint 的实现用于从客户端请求凭据。 AuthenticationEntryPoint 实现可能会执行重定向到登录页面,使用 WWW-Authenticate 标头进行响应等。

 

 

  ⑨ AbstractAuthenticationProcessingFilter


评论


亲,登录后才可以留言!