对于最新的稳定版本,请使用 Spring Security 6.4.1! |
Java 身份验证和授权服务 (JAAS) 提供程序
Spring Security 提供了一个包,用于将身份验证请求委托给 Java 身份验证和授权服务(JAAS)。 本节讨论该软件包。
AbstractJaasAuthenticationProvider
这AbstractJaasAuthenticationProvider
class 是提供的 JAAS 的基础AuthenticationProvider
实现。
子类必须实现一个方法,该方法创建LoginContext
.
这AbstractJaasAuthenticationProvider
具有许多可以注入其中的依赖项,如本节的其余部分所述。
JAAS 回调处理程序
大多数 JAASLoginModule
实例需要某种类型的回调。
这些回调通常用于获取用户的用户名和密码。
在 Spring Security 部署中, Spring Security 负责此用户交互(通过身份验证机制)。
因此,当身份验证请求被委托给 JAAS 时, Spring Security 的身份验证机制已经完全填充了一个Authentication
对象,其中包含 JAAS 所需的所有信息LoginModule
.
因此,Spring Security 的 JAAS 包提供了两个默认回调处理程序:JaasNameCallbackHandler
和JaasPasswordCallbackHandler
.
这些回调处理程序中的每一个都实现了JaasAuthenticationCallbackHandler
.
在大多数情况下,可以在不了解内部机制的情况下使用这些回调处理程序。
对于那些需要完全控制回调行为的用户,AbstractJaasAuthenticationProvider
internally包装这些JaasAuthenticationCallbackHandler
具有InternalCallbackHandler
.
这InternalCallbackHandler
是实际实现 JAAS 法线的类CallbackHandler
接口。
任何时候 JAASLoginModule
时,它会传递一个已配置的应用程序上下文列表InternalCallbackHandler
实例。
如果LoginModule
请求针对InternalCallbackHandler
实例,则回调又会传递给JaasAuthenticationCallbackHandler
正在包装的实例。
JAAS 权威授予者
JAAS 与校长合作。
甚至 “角色” 在 JAAS 中也表示为主体。
另一方面,Spring Security 与Authentication
对象。
每Authentication
object 包含一个 principal 和多个GrantedAuthority
实例。
为了便于在这些不同概念之间进行映射,Spring Security 的 JAAS 包包括一个AuthorityGranter
接口。
一AuthorityGranter
负责检查 JAAS 主体并返回一组String
对象,这些对象表示分配给主体的权限。
对于每个返回的授权字符串,AbstractJaasAuthenticationProvider
创建一个JaasGrantedAuthority
(它实现了 Spring Security 的GrantedAuthority
接口),该接口包含权限字符串和 JAAS 主体,其中AuthorityGranter
被通过。
这AbstractJaasAuthenticationProvider
首先使用 JAAS 成功验证用户的凭证,从而获取 JAAS 委托人LoginModule
,然后访问LoginContext
它返回。
对LoginContext.getSubject().getPrincipals()
,并将每个结果主体传递给每个AuthorityGranter
根据AbstractJaasAuthenticationProvider.setAuthorityGranters(List)
财产。
Spring Security 不包括任何生产环境AuthorityGranter
实例,前提是每个 JAAS 主体都具有特定于实现的含义。
但是,有一个TestAuthorityGranter
在单元测试中,演示了一个简单的AuthorityGranter
实现。
DefaultJaasAuthenticationProvider
这DefaultJaasAuthenticationProvider
让 JAASConfiguration
object 作为依赖项注入其中。
然后,它会创建一个LoginContext
通过使用注入的 JAASConfiguration
.
这意味着DefaultJaasAuthenticationProvider
不绑定到Configuration
如JaasAuthenticationProvider
是。
InMemoryConfiguration (内存配置)
为了便于注入Configuration
到DefaultJaasAuthenticationProvider
中,名为InMemoryConfiguration
。
实现构造函数接受Map
其中,每个键表示一个登录配置名称,值表示一个Array
之AppConfigurationEntry
实例。InMemoryConfiguration
还支持默认的Array
之AppConfigurationEntry
对象,如果在提供的Map
.
有关详细信息,请参阅Javadoc 的InMemoryConfiguration
.
DefaultJaasAuthenticationProvider 示例配置
虽然 Spring 的InMemoryConfiguration
可能比标准 JAAS 配置文件更详细,将其与DefaultJaasAuthenticationProvider
比JaasAuthenticationProvider
,因为它不依赖于默认的Configuration
实现。
下一个示例提供了DefaultJaasAuthenticationProvider
使用InMemoryConfiguration
.
请注意,的Configuration
可以很容易地注入DefaultJaasAuthenticationProvider
也。
<bean id="jaasAuthProvider"
class="org.springframework.security.authentication.jaas.DefaultJaasAuthenticationProvider">
<property name="configuration">
<bean class="org.springframework.security.authentication.jaas.memory.InMemoryConfiguration">
<constructor-arg>
<map>
<!--
SPRINGSECURITY is the default loginContextName
for AbstractJaasAuthenticationProvider
-->
<entry key="SPRINGSECURITY">
<array>
<bean class="javax.security.auth.login.AppConfigurationEntry">
<constructor-arg value="sample.SampleLoginModule" />
<constructor-arg>
<util:constant static-field=
"javax.security.auth.login.AppConfigurationEntry$LoginModuleControlFlag.REQUIRED"/>
</constructor-arg>
<constructor-arg>
<map></map>
</constructor-arg>
</bean>
</array>
</entry>
</map>
</constructor-arg>
</bean>
</property>
<property name="authorityGranters">
<list>
<!-- You will need to write your own implementation of AuthorityGranter -->
<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
</list>
</property>
</bean>
JaasAuthenticationProvider
这JaasAuthenticationProvider
假设默认的Configuration
是ConfigFile
.
做出此假设是为了尝试更新Configuration
.
这JaasAuthenticationProvider
然后使用默认的Configuration
要创建LoginContext
.
假设我们有一个 JAAS 登录配置文件/WEB-INF/login.conf
,其中包含以下内容:
JAASTest {
sample.SampleLoginModule required;
};
与所有 Spring Security bean 一样,JaasAuthenticationProvider
通过应用程序上下文进行配置。
以下定义对应于上述 JAAS 登录配置文件:
<bean id="jaasAuthenticationProvider"
class="org.springframework.security.authentication.jaas.JaasAuthenticationProvider">
<property name="loginConfig" value="/WEB-INF/login.conf"/>
<property name="loginContextName" value="JAASTest"/>
<property name="callbackHandlers">
<list>
<bean
class="org.springframework.security.authentication.jaas.JaasNameCallbackHandler"/>
<bean
class="org.springframework.security.authentication.jaas.JaasPasswordCallbackHandler"/>
</list>
</property>
<property name="authorityGranters">
<list>
<bean class="org.springframework.security.authentication.jaas.TestAuthorityGranter"/>
</list>
</property>
</bean>
作为主题运行
如果已配置,则JaasApiIntegrationFilter
尝试以Subject
在JaasAuthenticationToken
.
这意味着Subject
可使用以下方法访问:
Subject subject = Subject.getSubject(AccessController.getContext());
您可以使用 jaas-api-provision 属性配置此集成。 当与依赖于正在填充的 JAAS 主题的旧式或外部 API 集成时,此功能非常有用。