31. Java Authentication and Authorization Service (JAAS) Provider

31.1 Overview

Spring Security提供了一个能够将身份验证请求委托给Java身份验证和授权服务(JAAS)的包。这个包将在下面详细讨论。

31.2 AbstractJaasAuthenticationProvider

抽象身份验证提供程序(AbstractJaasAuthenticationProvider )是所提供的JAAS身份验证提供程序(AuthenticationProvider)实现的基础。子类必须实现一个创建逻辑上下文的方法。抽象JaasAuthenticationProvider有许多可以注入其中的依赖项,下面将对此进行讨论。

31.2.1 JAAS CallbackHandler

大多数JAAS逻辑模块都需要某种回调。这些回调通常用于从用户那里获取用户名和密码。

在Spring Security部署中,Spring Security负责这种用户交互(通过身份验证机制)。因此,当认证请求被委托给JAAS时,Spring Security的身份验证机制已经完全填充了一个身份验证对象,该对象包含JAAS登录模块(LoginModule)所需的所有信息。因此,Spring Security的JAAS包提供了两个默认的回调处理程序,JaasNameCallbackHandler和JaasPasswordCallbackHandler。这些回调处理程序中的每一个都实现了JaasAuthenticationCallbackHandler。在大多数情况下,这些回调处理程序可以在不理解内部机制的情况下简单地使用。

对于那些需要完全控制回调行为的人,内部抽象的JaasAuthenticationProvider用一个InternalCallbackHandler包装这些JaasAuthenticationCallbackHandler。InternalCallbackHandler是实际实现JAAS普通回调处理程序CallbackHandler 接口的类。每当使用JAAS逻辑模块LoginModule 时,它都会被传递一个已配置的应用程序上下文列表,如果登录模块请求对InternalCallbackHandler进行回调,回调将依次传递给正在包装的JaasAuthenticationCallbackHandler。

31.2.2 JAAS AuthorityGranter

JAAS和主角一起工作。在JAAS,甚至连“角色”都被描绘成主角。另一方面,Spring Security与身份验证对象一起工作。每个身份验证对象包含一个主体和多个授权(GrantedAuthority )。为了便于这些不同概念之间的映射,Spring Security的JAAS包包含了一个授权者(AuthorityGranter)接口。

授权者负责检查JAAS主体并返回一组字符串,代表分配给主体的授权。对于每个返回的授权字符串,抽象JaasAuthenticationProvider创建一个JaasGrantedAuthority(它实现了Spring Security的GrantedAuthority接口),包含授权字符串和授权者被传递的JAAS主体。抽象身份验证提供程序AbstractJaasAuthenticationProvider 首先使用JAAS登录模块LoginModule成功验证用户的凭据,然后访问它返回的登录上下文LoginContext ,从而获得JAAS主体。对LoginContext.getSubject().getPrincipals()的调用。并将每个生成的主体传递给根据抽象身份验证提供程序.设置授权者(列表)AbstractJaasAuthenticationProvider.setAuthorityGranters(List)属性定义的每个授权者。考虑到每个JAAS原则都有特定于实现的含义,Spring Security不包括任何生产授权者。但是,单元测试中有一个测试授权者,它演示了一个简单的授权者实现。

31.3 DefaultJaasAuthenticationProvider

默认身份验证提供程序DefaultJaasAuthenticationProvider 允许将JAAS配置对象作为依赖项注入其中。然后,它使用注入的JAAS配置创建一个逻辑上下文LoginContext 。这意味着DefaultJaasAuthenticationProvider不像Jaas authentication Provider那样绑定任何特定的配置实现。

31.3.1 InMemoryConfiguration

为了便于将配置注入到DefaultJaasauthenticationProvider中,提供了一个名为InMemoryConfiguration的默认内存实现。实现构造函数接受一个map,其中每个键代表一个登录配置名称,值代表一个应用配置条目数组。内存配置InMemoryConfiguration还支持默认的应用配置条目对象AppConfigurationEntry 数组,如果在提供的Map中没有找到映射,将使用该数组。有关详细信息,请参考InMemoryConfiguration的类级javadoc。

31.3.2 DefaultJaasAuthenticationProvider Example Configuration

虽然在内存配置中的Spring配置可能比标准的JAAS配置文件更详细,但是将它与默认的JaasAuthenticationProvider结合使用比JaasAuthenticationProvider更灵活,因为它不依赖于默认的配置实现。下面提供了一个使用内存配置InMemoryConfiguration 的DefaultJaasauthenticationProvider的配置示例。请注意,配置的自定义实现也可以很容易地注入到DefaultJaasauthenticationProvider中。


 

31.4 JaasAuthenticationProvider

JaasAuthenticationProvider假定默认配置是配置文件的一个实例。做出这一假设是为了尝试更新配置。JaasAuthenticationProvider然后使用默认配置Configuration 来创建登录上下文LoginContext。

假设我们有一个JAAS登录配置文件,/WEB-INF/login.conf,包含以下内容:


 

像所有的Spring安全beans一样,JaasAuthenticationProvider是通过应用程序上下文配置的。以下定义对应于上述JAAS登录配置文件:

 


 

31.5 Running as a Subject

配置后,JaasApiIntegrationFilter将尝试在JaasAuthenticationToken上作为主题运行。这意味着可以使用以下方式访问主题:

 


 

使用jaas-api-provision属性可以很容易地配置这种集成。当与依赖于JAAS主题的遗留或外部应用编程接口集成时,此功能非常有用。

 

posted @ 2020-08-16 18:14  节日快乐  阅读(368)  评论(0编辑  收藏  举报