对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

概述

Spring Security 提供了一个包,能够将身份验证请求委托给 Java 身份验证和授权服务 (JAAS)。 下面将详细讨论此软件包。Spring中文文档

摘要JaasAuthenticationProvider

这是所提供的 JAAS 实现的基础。 子类必须实现创建 . 有许多可以注入其中的依赖项,下面将讨论这些依赖项。AbstractJaasAuthenticationProviderAuthenticationProviderLoginContextAbstractJaasAuthenticationProviderSpring中文文档

JAAS CallbackHandler

大多数 JAAS 都需要某种回调。 这些回调通常用于从用户那里获取用户名和密码。LoginModuleSpring中文文档

在 Spring Security 部署中,Spring Security 负责此用户交互(通过身份验证机制)。 因此,当身份验证请求被委托给 JAAS 时,Spring Security 的身份验证机制已经完全填充了一个包含 JAAS 所需的所有信息的对象。AuthenticationLoginModuleSpring中文文档

因此,Spring Security 的 JAAS 包提供了两个缺省回调处理程序和 . 这些回调处理程序中的每一个都实现 。 在大多数情况下,这些回调处理程序可以简单地使用,而无需了解内部机制。JaasNameCallbackHandlerJaasPasswordCallbackHandlerJaasAuthenticationCallbackHandlerSpring中文文档

对于那些需要完全控制回调行为的用户,可以在内部用 . 是实际实现 JAAS 普通接口的类。 每当使用 JAAS 时,都会向它传递一个配置的应用程序上下文列表。 如果请求对 s 进行回调,则回调将依次传递给正在包装的 s。AbstractJaasAuthenticationProviderJaasAuthenticationCallbackHandlerInternalCallbackHandlerInternalCallbackHandlerCallbackHandlerLoginModuleInternalCallbackHandlerLoginModuleInternalCallbackHandlerJaasAuthenticationCallbackHandlerSpring中文文档

JAAS Authority授予者

JAAS 与校长合作。 甚至“角色”在 JAAS 中也表示为主体。 另一方面,Spring Security 适用于对象。 每个对象都包含一个主体和多个 s。 为了便于这些不同概念之间的映射,Spring Security 的 JAAS 软件包包含一个接口。AuthenticationAuthenticationGrantedAuthorityAuthorityGranterSpring中文文档

An 负责检查 JAAS 委托人并返回一组 s,表示分配给委托人的权限。 对于每个返回的授权字符串,都会创建一个(实现Spring Security的接口),其中包含授权字符串和传递的JAAS主体。 通过首先使用 JAAS 成功验证用户的凭证,然后访问 JAAS 返回的凭证来获取 JAAS 主体。 进行调用,并将每个生成的主体传递给针对该属性定义的每个主体。AuthorityGranterStringAbstractJaasAuthenticationProviderJaasGrantedAuthorityGrantedAuthorityAuthorityGranterAbstractJaasAuthenticationProviderLoginModuleLoginContextLoginContext.getSubject().getPrincipals()AuthorityGranterAbstractJaasAuthenticationProvider.setAuthorityGranters(List)Spring中文文档

Spring Security 不包括任何生产,因为每个 JAAS 主体都具有特定于实现的含义。 但是,在单元测试中有一个演示了一个简单的实现。AuthorityGranterTestAuthorityGranterAuthorityGranterSpring中文文档

默认JaasAuthenticationProvider

允许将 JAAS 对象作为依赖项注入其中。 然后,它使用注入的 JAAS 创建一个 . 这意味着它不受任何特定实现的约束。DefaultJaasAuthenticationProviderConfigurationLoginContextConfigurationDefaultJaasAuthenticationProviderConfigurationJaasAuthenticationProviderSpring中文文档

InMemory配置

为了便于将 注入 ,提供了一个名为 的默认内存中实现。 实现构造函数接受 ,其中每个键表示一个登录配置名称,值表示 s 的 。 还支持在提供的 中找不到映射时将使用的默认对象。 有关详细信息,请参阅 的类级 javadoc。ConfigurationDefaultJaasAuthenticationProviderInMemoryConfigurationMapArrayAppConfigurationEntryInMemoryConfigurationArrayAppConfigurationEntryMapInMemoryConfigurationSpring中文文档

DefaultJaasAuthenticationProvider 示例配置

虽然 Spring 配置可能比标准 JAAS 配置文件更冗长,但将其结合使用比不依赖于默认实现更灵活。InMemoryConfigurationDefaultJaasAuthenticationProviderJaasAuthenticationProviderConfigurationSpring中文文档

下面提供了使用示例配置。 请注意,自定义实现也可以很容易地注入其中。DefaultJaasAuthenticationProviderInMemoryConfigurationConfigurationDefaultJaasAuthenticationProviderSpring中文文档

<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

假定默认值是 ConfigFile 的实例。 做出此假设是为了尝试更新 . 然后使用默认值创建 .JaasAuthenticationProviderConfigurationConfigurationJaasAuthenticationProviderConfigurationLoginContextSpring中文文档

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

JAASTest {
	sample.SampleLoginModule required;
};

与所有 Spring Security Bean 一样,它是通过应用程序上下文配置的。 以下定义与上述 JAAS 登录配置文件相对应:JaasAuthenticationProviderSpring中文文档

<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>

作为主题运行

如果已配置,则将尝试以 . 这意味着可以使用以下方式访问:JaasApiIntegrationFilterSubjectJaasAuthenticationTokenSubjectSpring中文文档

Subject subject = Subject.getSubject(AccessController.getContext());

可以使用 jaas-api-provision 属性轻松配置此集成。 当与依赖于填充的 JAAS 主题的旧 API 或外部 API 集成时,此功能非常有用。Spring中文文档