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 重写机制

DataSourceRealm

DataSourceRealm 是 Tomcat Realm 接口的一种实现,它通过一个 JNDI 命名的 JDBC 数据源在关系型数据库中查找用户。只要数据库结构符合下列要求,你可以通过大量的配置来灵活地修改现有的表与列名。

  • 必须有一张用户表users table)。它包含着一个由 Realm 所能识别的所有合法用户所构成的行。
  • 用户表必须至少包含两列(当然,如果现有应用确实需要,则同样也可以包含更多的列):
  • 用户名: 当用户登录时,能被 Tomcat 识别的用户名。
  • 密码: 当用户登录时,能被 Tomcat 所识别的密码。该列中的值可能是明文,也可能是摘要式密码,稍后详述。
  • 必须有一张用户角色表(user roles table)。该表包含一个角色行,包含着可能指定给特定用户的每个合法角色。一个用户可以没有角色,也可以有一个或多个角色,这都是合法的。
  • 用户角色表 至少应包含两列(如果现有应用确实需要,则也可以包含更多的列):
  • 用户名。Tomcat 所能识别的用户名(与用户表中指定的值相同)。
  • 用户所对应的合法角色名。

快速入门

为了设置 Tomcat 从而使用 DataSourceRealm,需要执行以下步骤:

  1. 在数据库中创建符合上述规范的表与列。
  2. 配置一个 Tomcat 使用的数据库用户名与密码,并且至少有只读权限(Tomcat 永远都不会去修改那些表中的数据)。
  3. 为数据库配置一个 JNDI 命名的 JDBC DataSource。详情可参考JNDI DataSource Example HOW-TO》应该链接至相应中文页面》
  4.  $CATALINA_BASE/conf/server.xml 目录中设置一个  元素。这一点下文将会详细叙述。
  5. 如果 Tomcat 处于运行状态,则重启它。

范例

下面这个 SQL 脚本范例创建了我们所需的表(根据你所用的数据库,可以相应修改其中的语法)。

create table users (
  user_name         varchar(15) not null primary key,
  user_pass         varchar(15) not null
);
create table user_roles (
  user_name         varchar(15) not null,
  role_name         varchar(15) not null,
  primary key (user_name, role_name)
);

在下面的范例中,有一个名为 authority 的 MySQL 数据库,它包含上述创建的表,通过名为 “java:/comp/env/jdbc/authority” 的 JNDI 命名的 JDBC 数据源来访问。

<Realm className="org.apache.catalina.realm.DataSourceRealm"
   dataSourceName="jdbc/authority"
   userTable="users" userNameCol="user_name" userCredCol="user_pass"
   userRoleTable="user_roles" roleNameCol="role_name"/>

特别注意事项

使用 DataSourceRealm 时必须遵守下列规则:

  • 当用户首次访问一个受保护资源时,Tomcat 会调用这一 Realm 的 authenticate() 方法,从而使任何对数据库的即时修改(新用户、密码或角色改变,等等)都能立即生效。
  • 一旦用户认证成功,在登录后,该用户(及其相应角色)就将缓存在 Tomcat 中。(对于以表单形式的认证,这意味着直到会话超时或者无效才会过期;对于基本形式的验证,意味着直到用户关闭浏览器才会过期。)在会话序列化期间不会保存或重置缓存的用户。对已认证用户的数据库信息进行的任何改动都不会生效,直到该用户下次登录。

应用负责管理users(用户表)和user roles(用户角色表)中的信息。Tomcat 没有提供任何内置功能来维护这两种表。