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
实现。