从 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&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&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),如下图: