Realm 接口的一种实现,通过 Java Authentication & Authorization Service(JAAS,Java身份验证与授权服务)架构来实现对用户身份的验证。JAAS 架构现已加入到标准的 Java SE API 中。
通过 JAASRealm,开发者实际上可以将任何安全的 Realm 与 Tomcat 的 CMA 一起组合使用。
JAASRealm 是 Tomcat 针对基于 JAAS 的 J2EE 1.4 的 J2EE 认证框架的原型实现,基于 JCP Specification Request 196,从而能够增强容器管理安全性,并且能促进“可插拔的”认证机制,该认证机制能够实现与容器的无关性。
根据 JAAS 登录模块和准则(参见 javax.security.auth.spi.LoginModule 与 javax.security.Principal 的相关说明),你可以自定义安全机制,或者将第三方的安全机制与 Tomcat 所实现的 CMA 相集成。
为了利用自定义的 JAAS 登录模块使用 JAASRealm,需要执行如下步骤:
编写自己的 JAAS 登录模块。在开发自定义登录模块时,将通过 JAAS 登录上下文对基于 JAAS 2的 User 和 Role 类管理。注意,JAASRealm 内建的 CallbackHandler 目前只能识别 NameCallback 和 PasswordCallback。
javax.security.Principal,从而使 Tomcat 明白从登录模块中返回的规则究竟是用户还是角色(参看 org.apache.catalina.realm.JAASRealm 相关描述)。不管怎样,第一个返回的规则总被认为是用户规则。
为 Java 建立一个 login.config 文件。将其位置指定给 JVM,从而便于 Tomcat 明确它的位置。例如,设置如下环境变量:
JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config
在上述步骤中,为了配置步骤 6 以上的 JAASRealm,需要创建一个 <Realm> 元素,并将其内嵌在 <Engine> 元素中的$CATALINA_BASE/conf/server.xml 文件内。
下例是 server.xml 中的一截代码段:
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"/>
完全由登录模块负责创建并保存用于表示用户规则的 User 与 Role 对象(javax.security.auth.Subject)。如果登录模块不仅无法创建用户对象,而且也无法抛出登录异常,Tomcat CMA 就会失去作用,所在页面就会变成http://localhost:8080/myapp/j_security_check 或其他未指明的页面。
JAAS 方法具有双重的灵活性:
Realm 的 authenticate() 方法。
server.xml 中的 <Realm> 元素包含一个 digest 属性,则支持摘要式密码。JAASRealm 的 CallbackHandler 将先于将密码传回 LoginModule 之前,对密码进行摘要式处理。