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
之前,对密码进行摘要式处理。