标准 Realm 实现 - Tomcat 教程 - 极悦

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 没有提供任何内置功能来维护这两种表。