JAASRealm

JAASRealm 是 Tomcat 的 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,需要执行如下步骤:

  1. 编写自己的 JAAS 登录模块。在开发自定义登录模块时,将通过 JAAS 登录上下文对基于 JAAS 2的 User 和 Role 类管理。注意,JAASRealm 内建的 CallbackHandler 目前只能识别 NameCallback 和 PasswordCallback

  2. 尽管 JAAS 并未明确指定,但你也应该为用户和角色创建不同的类来加以区分,它们都应该扩展自 javax.security.Principal,从而使 Tomcat 明白从登录模块中返回的规则究竟是用户还是角色(参看 org.apache.catalina.realm.JAASRealm 相关描述)。不管怎样,第一个返回的规则总被认为是用户规则。
  3. 将编译好的类指定在 Tomcat 的类路径中。
  4. 为 Java 建立一个 login.config 文件。将其位置指定给 JVM,从而便于 Tomcat 明确它的位置。例如,设置如下环境变量:
    JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config

  5. 为了保护一些资源,在 web.xml 中配置安全限制。
  6. 在 server.xml 中配置 JAASRealm 模块。
  7. 重启 Tomcat(如果它正在运行)。

Realm 元素属性

在上述步骤中,为了配置步骤 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 方法具有双重的灵活性:

  • 你可以在自定义的登录模块后台执行任何所需的进程。
  • 通过改变配置以及重启服务器,你可以插入一个完全不同的登录模块,不需要对应用做出任何改动。

特别注意事项

  • 当用户首次访问一个受保护资源时,Tomcat 会调用这一 Realm 的 authenticate() 方法。
  • 一旦用户认证成功,在登录后,该用户(及其相应角色)就将缓存在 Tomcat 中。(对于以表单形式的认证,这意味着直到会话超时或者无效才会过期;对于基本形式的验证,意味着直到用户关闭浏览器才会过期。)在会话序列化期间不会保存或重置缓存的用户。对已认证用户的数据库信息进行的任何改动都不会生效,直到该用户下次登录。
  • 和其他 Realm 实现一样,如果 server.xml 中的 <Realm> 元素包含一个 digest 属性,则支持摘要式密码。JAASRealm 的 CallbackHandler 将先于将密码传回 LoginModule 之前,对密码进行摘要式处理。
联系我们

邮箱 626512443@qq.com
电话 18611320371(微信)
QQ群 235681453

Copyright © 2015-2022

备案号:京ICP备15003423号-3