(通译)Spring Security-2.0.x参考文档“Java认证和授权服务(JAAS)供应”

(翻译)Spring Security-2.0.x参考文档“Java认证和授权服务(JAAS)供应”
Java认证和授权服务(JAAS)供应器
15.1. 概述

Spring Security提供一个包,可以代理Java认证和授权服务(JAAS)的认证请求。 这个包的细节在下面讨论。

JAAS的核心是登录配置文件。 想要了解更多JAAS登录配置文件的信息,可以查询Sun公司的JAAS参考文档。 我们希望你对JAAS有一个基本了解,也了解它的登录配置语法,这才能更好的理解这章的内容。
15.2. 配置

这个 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.providers.jaas.JaasAuthenticationProvider">
  <property name="loginConfig" value="/WEB-INF/login.conf"/>
  <property name="loginContextName" value="JAASTest"/>
  <property name="callbackHandlers">
    <list>
      <bean class="org.springframework.security.providers.jaas.JaasNameCallbackHandler"/>
      <bean class="org.springframework.security.providers.jaas.JaasPasswordCallbackHandler"/>
    </list>
  </property>
  <property name="authorityGranters">
    <list>
      <bean class="org.springframework.security.providers.jaas.TestAuthorityGranter"/>
    </list>
  </property>
</bean>

这个 CallbackHandler和AuthorityGranter会在下面进行讨论。
15.2.1. JAAS CallbackHandler

大多数JAAS的登录模块需要设置一系列的回调方法。 这些回调方法通常用来获得用户的用户名和密码。

在Spring Security发布的时候,Spring Security负责用户交互(通过认证机制)。 因此,现在认证请求使用JAAS代理,Spring Security的认证机制将组装一个Authentication对象,它包含了所有JAASLoginModule需要的信息。

因此,Spring Security的JAAS包提供两个默认的回调处理器,JaasNameCallbackHandler 和 JaasPasswordCallbackHandler。 他们两个都实现了JaasAuthenticationCallbackHandler。 大多数情况下,这些回调函数可以直接使用,不用了解它们的内部机制。

为了需要完全控制回调行为,内部JaasAutheticationProvider使用一个InternalCallbackHandler封装这个JaasAuthenticationCallbackHandler。 这个InternalCallbackHandler才是实际实现了JAAS通常的CallbackHandler接口。 任何时候JAASLoginModule被使用的时候,它传递一个application context里配置的InternalCallbackHandler列表。 如果这个LoginModule需要回调InternalCallbackHandler,回调会传递封装好的JaasAuthenticationCallbackHandler。
15.2.2. JAAS AuthorityGranter

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实现。
1 楼 SINCE1978 2008-08-26  
spring一向以简洁明了易学易用让人喜欢,看来spring acegi对jaas蹩脚的API也没什么简化的改善(不知道是不是因为jaas实在太变态了没法改进)。还是这么难看难学!