Tomcat JDBCRealm 领域

从 JDBCRealm 名字可以猜出,该领域对象跟数据库脱不了关系。相对于 UserDatabaseRealm 而言,它具有更大的灵活性,能动态地访问数据。

该领域中的用户、密码和角色保存在数据库中,JDBCRealm 会通过 SQL 语句访问它们,进行权限校验。例如:假如现成的管理软件在关系型数据库的数据表中新增一个账号,JDBCRealm 就会立即访问它。在 server.xml 文件中,需要将 JDBC 的连接参数设置成领域的属性。配置如下:

<Realm className="领域类名称"
        driveName="数据库JDBC驱动类名"
        connectionURL="数据JDBC连接URL地址"
        connectionName="数据库账号"
        connectionPassword="数据库密码"
        userTable="用户表名"
        userRoleTable="用户角色表名"
        userNameCol="用户名列"
    />

<Realm> 元素属性说明:

  • className  此 Realm 实现的 Java 类名,对于 JDBCRealm 而言,必须是 org.apache.catalina.realm.JDBCRealm

  • connectionName  用来建立 JDBC 连接的数据库用户名

  • connectionPassword  用来建立 JDBC 连接的数据库密码

  • connectionURL  用来建立 JDBC 连接的数据库 URL,如:jdbc:mysql://127.0.0.1:3306/tomcat_realm?useSSL=false&amp;serverTimezone=UTC

  • digest  摘要算法(SHA、MD5 或只有 MD5),默认值是“cleartext”

  • driverName  JDBC 驱动程序的 Java 类名,如:com.mysql.jdbc.Driver

  • roleNameCol  在用户与角色数据表中,角色名的字段名

  • userNameCol  在用户与角色数据表中,用户名的字段名

  • userCredCol  用户数据表中,列出用户的用户密码的字段名

  • userRoleTable  将角色映射至用户的数据表名

  • userTable  列出用户与密码的数据表名

示例

数据库表

(1)在本地 MySQL 数据库中创建一个名为 tomcat_realm 的数据库

(2)在 tomcat_realm 数据库中创建三张数据表,分别如下:

a、用户表(t_user),用来存放用户信息,如:账号、用户名、密码。SQL脚本如下:

CREATE TABLE `t_user` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `account` varchar(255) DEFAULT NULL COMMENT '账号',
  `username` varchar(255) DEFAULT NULL COMMENT '用户名',
  `password` varchar(255) DEFAULT NULL COMMENT '密码',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4;

数据表创建好后,添加一个 admin 账号,如下图:

b、角色表(t_role),用来存放所有角色信息,SQL脚本如下:

CREATE TABLE `t_role` (
  `role` varchar(255) NOT NULL COMMENT '角色编码',
  `role_name` varchar(255) DEFAULT NULL COMMENT '角色名称',
  PRIMARY KEY (`role`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据表创建好后,添加几个 Tomcat 角色,如下图:

c、用户角色表(t_user_role),用来存放用户和角色的关系,SQL脚本如下:

CREATE TABLE `t_user_role` (
  `account` varchar(255) NOT NULL COMMENT '用户账号',
  `role` varchar(255) NOT NULL COMMENT '角色编号',
  PRIMARY KEY (`account`,`role`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

数据表创建好后,添加 admin 账号的角色关系数据,如下图:

到这里,需要用到的数据库表就创建完了。

领域配置

(1)将 mysql 的 jdbc 驱动 jar 文件拷贝到 %CATALINA_TOMCAT%/lib 目录下面

(2)编辑 %CATALINA_TOMCAT%/conf/server.xml 文件,如下图:

<?xml version='1.0' encoding='utf-8'?>
<Server port="8005" shutdown="SHUTDOWN">
  <!-- ... -->
  <Service name="Catalina">
    <!-- ... -->
    <Engine name="Catalina" defaultHost="localhost">
      <!-- Use the LockOutRealm to prevent attempts to guess user passwords
           via a brute-force attack -->
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.JDBCRealm"
               driverName="com.mysql.jdbc.Driver"
               connectionURL="jdbc:mysql://127.0.0.1:3306/tomcat_realm?useSSL=false&amp;serverTimezone=UTC"
               connectionName="root"
               connectionPassword="aaaaaa"
               digest="MD5"
               userTable="t_user"
               userRoleTable="t_user_role"
               userCredCol="password"
               userNameCol="account"
               roleNameCol="role" />
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="true">
        <!-- ... -->
      </Host>
    </Engine>
  </Service>
</Server>

上面配置中,用户密码使用MD5进行加密。

配置完成后,重启 Tomcat。

配置验证

使用浏览器访问 http://localhost:8080/manager/html 地址,此时弹出框提示输入用户名和密码(admin/aaaaaa),如下图:

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号