对于最新的稳定版本,请使用 Spring Security 6.3.3! |
对于最新的稳定版本,请使用 Spring Security 6.3.3! |
AbstractJaasAuthenticationProvider
这是提供的 JAAS 实现的基础。
子类必须实现一个创建 .
它有许多可以注入其中的依赖项,下面将对此进行讨论。AbstractJaasAuthenticationProvider
AuthenticationProvider
LoginContext
AbstractJaasAuthenticationProvider
JAAS 回调处理程序
大多数 JAAS 都需要某种回调。
这些回调通常用于获取用户的用户名和密码。LoginModule
在 Spring Security 部署中, Spring Security 负责此用户交互(通过身份验证机制)。
因此,当身份验证请求被委托给 JAAS 时, Spring Security 的身份验证机制已经完全填充了一个包含 JAAS 所需的所有信息的对象。Authentication
LoginModule
因此,Spring Security 的 JAAS 包提供了两个默认回调处理程序,即 .
这些回调处理程序中的每一个都实现 。
在大多数情况下,这些回调处理程序可以简单地使用,而无需了解内部机制。JaasNameCallbackHandler
JaasPasswordCallbackHandler
JaasAuthenticationCallbackHandler
对于需要完全控制回调行为的用户,可以在内部用 .
这是实际实现 JAAS 普通接口的类。
每当使用 JAAS 时,都会向它传递一个配置了应用程序上下文的列表。
如果 请求针对 s 的回调,则回调将依次传递给正在包装的 s。AbstractJaasAuthenticationProvider
JaasAuthenticationCallbackHandler
InternalCallbackHandler
InternalCallbackHandler
CallbackHandler
LoginModule
InternalCallbackHandler
LoginModule
InternalCallbackHandler
JaasAuthenticationCallbackHandler
JAAS 权威授予者
JAAS 与校长合作。
甚至 “角色” 在 JAAS 中也表示为主体。
另一方面,Spring Security 适用于对象。
每个对象都包含一个主体和多个 s。
为了促进这些不同概念之间的映射,Spring Security 的 JAAS 包包括一个接口。Authentication
Authentication
GrantedAuthority
AuthorityGranter
An 负责检查 JAAS 主体并返回一组 s,这些 s 表示分配给该主体的权限。
对于每个返回的权限字符串,将创建一个(实现 Spring Security 的接口),其中包含权限字符串和传递的 JAAS 主体。
首先使用 JAAS 成功验证用户的凭据,然后访问它返回的凭据,从而获取 JAAS 委托人。
进行 调用,并将每个生成的 principal 传递给针对属性定义的每个 principal。AuthorityGranter
String
AbstractJaasAuthenticationProvider
JaasGrantedAuthority
GrantedAuthority
AuthorityGranter
AbstractJaasAuthenticationProvider
LoginModule
LoginContext
LoginContext.getSubject().getPrincipals()
AuthorityGranter
AbstractJaasAuthenticationProvider.setAuthorityGranters(List)
Spring Security 不包括任何 productions,因为每个 JAAS 主体都具有特定于实现的含义。
但是,单元测试中有一个演示简单实现的函数。AuthorityGranter
TestAuthorityGranter
AuthorityGranter
DefaultJaasAuthenticationProvider
它允许将 JAAS 对象作为依赖项注入其中。
然后,它使用注入的 JAAS 创建一个 .
这意味着 is not bound any specific implementation of as is.DefaultJaasAuthenticationProvider
Configuration
LoginContext
Configuration
DefaultJaasAuthenticationProvider
Configuration
JaasAuthenticationProvider
InMemoryConfiguration (内存配置)
为了便于注入 into ,提供了一个名为 的默认内存实现。
实现构造函数接受 a,其中每个键表示登录配置名称,值表示 of s。 还支持在提供的 .
有关详细信息,请参阅 的类级别 javadoc。Configuration
DefaultJaasAuthenticationProvider
InMemoryConfiguration
Map
Array
AppConfigurationEntry
InMemoryConfiguration
Array
AppConfigurationEntry
Map
InMemoryConfiguration
DefaultJaasAuthenticationProvider 示例配置
虽然 的 Spring 配置可能比标准 JAAS 配置文件更详细,但将其结合使用比它更灵活,因为它不依赖于默认实现。InMemoryConfiguration
DefaultJaasAuthenticationProvider
JaasAuthenticationProvider
Configuration
下面提供了 using 的示例配置。
请注意,的自定义实现也可以很容易地注入 。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
假定默认值是 ConfigFile 的实例。
做出此假设是为了尝试更新 .
then 使用默认值创建 .JaasAuthenticationProvider
Configuration
Configuration
JaasAuthenticationProvider
Configuration
LoginContext
假设我们有一个 JAAS 登录配置文件 ,其中包含以下内容:/WEB-INF/login.conf
JAASTest {
sample.SampleLoginModule required;
};
像所有 Spring Security bean 一样,它是通过应用程序上下文配置的。
以下定义对应于上述 JAAS 登录配置文件:JaasAuthenticationProvider
<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 集成时,此功能非常有用。