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


SecurityContextHolder可以在启动时配置一个策略,以指定您希望如何存储上下文 。对于独立的应用程序,您将使用
SecurityContextHolder.MODE_GLOBAL策略 。其他应用程序可能希望安全线程生成的线程也采用相同的安全标识 。这是通过使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL实现的 。您可以通过两种方式更改默认SecurityContextHolder.MODE_THREADLOCAL的模式 。第一个是设置系统属性,第二个是调用SecurityContextHolder上的静态方法 。大多数应用程序不需要改变默认设置,但如果需要,请查看SecurityContextHolder的JavaDoc以了解更多信息 。
SecurityContextSecurityContext从SecurityContextHolder中获取 。SecurityContext包含一个Authentication对象 。
Authentication在Spring Security中,Authentication有两个主要目的:

  • AuthenticationManager的输入,用于提供用户为进行身份验证而提供的凭证 。在此场景中使用时,isAuthenticated()返回false 。
  • 表示当前通过身份验证的用户 。当前的Authentication可以从SecurityContext中获取 。
Authentication包含如下内容:
  • principal:用户标识 。当使用用户名/密码进行身份验证时,这通常是UserDetails的一个实例
  • credentials:通常指一个密码 。在许多情况下,这将在用户身份验证后清除,以确保不会泄漏 。
  • authorities:GrantedAuthoritys是授予用户的高级权限 。一些例子是角色或作用域 。
GrantedAuthorityGrantedAuthority为用户被授予的高级权限 。一些例子是角色或作用域 。
GrantedAuthority可以从
Authentication.getAuthorities()方法获得 。此方法提供了一个GrantedAuthority对象集合 。GrantedAuthority是授予主体的权限,这并不奇怪 。这样的权限通常是“角色”,例如ROLE_ADMINISTRATOR或ROLE_HR_SUPERVISOR 。稍后将为web授权、方法授权和域对象授权配置这些角色 。Spring Security的其他部分能够解释这些权限,并期望它们存在 。当使用基于用户名/密码的身份验证时,GrantedAuthority通常由UserDetailsService加载 。
通常,GrantedAuthority对象是应用程序范围的权限 。它们不是特定于给定的域对象 。因此,您不太可能拥有一个GrantedAuthority来表示对Employee对象编号54的权限,因为如果有数千个这样的权限,您将很快耗尽内存(或者至少导致应用程序花很长时间来验证用户) 。当然,Spring Security是专门设计来处理这一常见需求的,但是您可以使用项目的域对象安全功能来实现这一目的 。
AuthenticationManagerAuthenticationManager是定义Spring Security的过滤器如何执行身份验证的API 。然后,调用AuthenticationManager的控制器(即Spring Security的Filterss)在SecurityContextHolder上设置返回的Authentication 。如果你没有集成Spring Security的过滤器,你可以直接设置SecurityContextHolder,而不需要使用AuthenticationManager 。
虽然AuthenticationManager的实现可以是任何内容,但最常见的实现是ProviderManager 。
ProviderManagerProviderManager是AuthenticationManager最常用的实现 。ProviderManager委托给AuthenticationProviders列表 。每个AuthenticationProvider都有机会表明身份验证应该是成功的或失败的,或者表明它不能做出决定,并允许下游的AuthenticationProvider来做出决定 。如果配置的AuthenticationProviders中没有一个可以进行身份验证,那么身份验证将失败,因为ProviderNotFoundException是特殊的AuthenticationException,表示ProviderManager没有配置成支持传递给它的身份验证类型 。
Spring Security身份验证详细介绍

文章插图
ProvviderManager 介绍
实际上,每个AuthenticationProvider都知道如何执行特定类型的身份验证 。例如,一个AuthenticationProvider可能能够验证用户名/密码,而另一个AuthenticationProvider可能能够验证SAML断言 。这允许每个AuthenticationProvider执行特定类型的身份验证,同时支持多种类型的身份验证,并且只公开一个AuthenticationManager bean 。
ProviderManager还允许配置一个可选的父AuthenticationManager,当AuthenticationProvider不能执行身份验证时,会咨询该父AuthenticationManager 。父类可以是任何类型的AuthenticationManager,但它通常是ProviderManager的一个实例 。
Spring Security身份验证详细介绍


推荐阅读