Tomca教程
Tomcat Manager
Tomcat Realm 配置
Tomcat 安全管理
Tomcat JNDI 资源
Tomcat JDBC 数据源
Tomcat 类加载机制
Tomcat JSPs
Tomcat SSL/TLS配置
Tomcat SSI
Tomcat CGI
Tomcat 代理支持
Tomcat MBean 描述符
Tomcat 默认 Servlet
Tomcat 集群
Tomcat 连接器
Tomcat监控与管理
Tomcat 日志机制
Tomcat 基于 APR 的原生库
Tomcat 虚拟主机
Tomcat 高级 IO 机制
Tomcat 附加组件
Tomcat 安全性注意事项
Tomcat Windows 服务
Tomcat Windows 认证
Tomcat 的 JDBC 连接池
Tomcat WebSocket 支持
Tomcat 重写机制

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

  • 编写自己的 JAAS 登录模块。在开发自定义登录模块时,将通过 JAAS 登录上下文对基于 JAAS 2 User 和 Role 类管理。注意,JAASRealm 内建的 CallbackHandler 目前只能识别 NameCallback 和 PasswordCallback
  • 详情请参看 JAAS 认证教程 与 JAAS 登录模块开发教程
  • 尽管 JAAS 并未明确指定,但你也应该为用户和角色创建不同的类来加以区分,它们都应该扩展自 javax.security.Principal,从而使 Tomcat 明白从登录模块中返回的规则究竟是用户还是角色(参看 org.apache.catalina.realm.JAASRealm 相关描述)。不管怎样,第一个返回的规则被认为是用户规则。
  • 将编译好的类指定在 Tomcat 的类路径中。

Java 建立一个 login.config 文件(参见 JAAS LoginConfig 文件)。将其位置指定给 JVM,从而便于 Tomcat 明确它的位置。例如,设置如下环境变量:

JAVA_OPTS=$JAVA_OPTS -Djava.security.auth.login.config==$CATALINA_BASE/conf/jaas.config
  • 为了保护一些资源,在 web.xml 中配置安全限制。
  • server.xml 中配置 JAASRealm 模块。
  • 重启 Tomcat(如果它正在运行)。

Realm 元素属性

在上述步骤中,为了配置步骤 6 以上的 JAASRealm,需要创建一个  元素,并将其内嵌在  元素中的 $CATALINA_BASE/conf/server.xml 文件内。关于 JAASRealm 中的属性定义可参看 Realm 配置文档

范例

下例是 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 中的  元素包含一个 digest 属性,则支持摘要式密码。JAASRealm 的 CallbackHandler 将先于将密码传回 LoginModule 之前,对密码进行摘要式处理。