Spring Security提供一个包,可以代理Java认证和授权服务(JAAS)的认证请求。 这个包的细节在下面讨论。
JAAS的核心是登录配置文件。 想要了解更多JAAS登录配置文件的信息,可以查询Sun公司的JAAS参考文档。 我们希望你对JAAS有一个基本了解,也了解它的登录配置语法,这才能更好的理解这章的内容。
这个 JaasAuthenticationProvider 通过JAAS认证用户的主体和证书。
让我们假设我们有一个JAAS登录配置文件,/WEB-INF/login.conf,里边的内容如下:
JAASTest {
sample.SampleLoginModule required;
};就像所有的Spring Security bean一样,这个JaasAuthenticationProvider 要配置在application context里。
下面的定义是与上面的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>
这个 CallbackHandler和AuthorityGranter会在下面进行讨论。
大多数JAAS的登录模块需要设置一系列的回调方法。
这些回调方法通常用来获得用户的用户名和密码。
在Spring Security发布的时候,Spring Security负责用户交互(通过认证机制)。
因此,现在认证请求使用JAAS代理,Spring Security的认证机制将组装一个Authentication对象,它包含了所有JAASLoginModule需要的信息。
因此,Spring Security的JAAS包提供两个默认的回调处理器,JaasNameCallbackHandler 和
JaasPasswordCallbackHandler。
他们两个都实现了JaasAuthenticationCallbackHandler。
大多数情况下,这些回调函数可以直接使用,不用了解它们的内部机制。
为了需要完全控制回调行为,内部JaasAuthenticationProvider使用一个InternalCallbackHandler封装这个JaasAuthenticationCallbackHandler。
这个InternalCallbackHandler才是实际实现了JAAS通常的CallbackHandler接口。
任何时候JAASLoginModule被使用的时候,它传递一个application context里配置的InternalCallbackHandler列表。
如果这个LoginModule需要回调InternalCallbackHandler,回调会传递封装好的JaasAuthenticationCallbackHandler。
JAAS工作在主体上。
任何“角色”在JAAS里都是作为主体表现的。
另一方面Spring Security使用Authentication对象。
每个Authentication对象包含单独的主体和多个GrantedAuthority[]。
为了方便映射不同的概念,Spring Security的JAAS包包含了AuthorityGranter接口。
一个 AuthorityGranter负责检查JAAS主体,返回一个String的集合,用来表示分配给这个主体的权限。
对于每一个返回的权限字符串,JaasAuthenticationProvider会创建一个JaasGrantedAuthority(它实现了Spring Security的GrantedAuthority接口),包含了AuthorityGranter返回的字符串和AuthorityGranter传递的JAAS主体。
JaasAuthenticationProvider获得JAAS主体,通过首先成功认证用户的证书,使用JAAS的LoginModule,然后调用LoginContext.getSubject().getPrincipals(),使用返回的每个主体,传递到每个AuthorityGranter里,最后定义在JaasAuthenticationProvider.setAuthorityGranters(List)属性里。
Spring Security没有包含任何产品型的AuthorityGranter,因为每个JAAS主体都有特殊实现的意义。
但是,这里的单元测试里有一个TestAuthorityGranter,演示了一个简单的AuthorityGranter实现。