身份验证可以由一个web应用程序控制或由容器(比如Tomcat 年代 W web应用程序中运行)。 Tomcat容器管理的安全是基于领域。 领域包含了用户的姓名,密码,和角色。
我配置了Tomcat(5.5.20版)是一个UserDatabase领域一个活跃的领域。 UserDatabase领域使用tomcat用户。 Tomcat的配置目录中的xml文件位置的名称,密码,和角色数据。 从这个文件将Tomcat启动时加载数据,而不是在其他时间。 通常您需要修改这个文件手动更新它,所以它可能是在开发过程中最有用的而不是一个实际生产系统。
Tomcat可以配置为其他更健壮的领域选择。 这样的一个替代方法是一个JDBC W 领域。 JDBC域在UserDatabase域的好处包括能够在运行时动态更新JDBC域数据,而不是只在启动时。 在Tomcat的服务器。 xml文件中,我们可以看到UserDatabase域注释而样本JDBC域为MySQL W 注释掉:
... <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> ... <!-- <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="org.gjt.mm.mysql.Driver" connectionURL="jdbc:mysql://localhost/authority" connectionName="test" connectionPassword="test" userTable="users" userNameCol="user_name" userCredCol="user_pass" userRoleTable="user_roles" roleNameCol="role_name" /> --> ...
现在,让我们创建一个MySQL数据库 W 存储领域的用户名、密码和角色。 我在我的机器上已经安装了MySQL。 我将运行以下create_tomcat_realm_database。 sql脚本创建一个“tomcat_realm”数据库:
DROP DATABASE IF EXISTS tomcat_realm; CREATE DATABASE tomcat_realm; USE tomcat_realm; CREATE TABLE tomcat_users ( user_name varchar(20) NOT NULL PRIMARY KEY, password varchar(32) NOT NULL ); CREATE TABLE tomcat_roles ( role_name varchar(20) NOT NULL PRIMARY KEY ); CREATE TABLE tomcat_users_roles ( user_name varchar(20) NOT NULL, role_name varchar(20) NOT NULL, PRIMARY KEY (user_name, role_name), CONSTRAINT tomcat_users_roles_foreign_key_1 FOREIGN KEY (user_name) REFERENCES tomcat_users (user_name), CONSTRAINT tomcat_users_roles_foreign_key_2 FOREIGN KEY (role_name) REFERENCES tomcat_roles (role_name) ); INSERT INTO tomcat_users (user_name, password) VALUES ('deron', 'deronpass'); INSERT INTO tomcat_users (user_name, password) VALUES ('larry', 'buythecompetition'); INSERT INTO tomcat_roles (role_name) VALUES ('dude'); INSERT INTO tomcat_roles (role_name) VALUES ('manager'); INSERT INTO tomcat_users_roles (user_name, role_name) VALUES ('deron', 'dude'); INSERT INTO tomcat_users_roles (user_name, role_name) VALUES ('deron', 'manager'); INSERT INTO tomcat_users_roles (user_name, role_name) VALUES ('larry', 'dude'); COMMIT;
对于一个JDBC域,您需要一个数据库基本上有两个表。 需要列一个表,用户名和密码的另一个列。 第二个表需要一个用户名和一个列列的角色。 数据库、表和列可以命名为任何你希望他们透露姓名,因为他们可以指定在server.xml JDBC域条目。 但是,用户名称列第一个表和第二个表的用户名列需要具有相同的名称。
create_tomcat_realm_database。 sql是比这更多的“正确性”。 它创建了一个“tomcat_users”表用户名(user_name列)和密码(密码列),它集user_name为主键列。 它创建了一个“tomcat_roles”表来存储role_name中的角色名称列,设置为主键。 它创建了一个“tomcat_users_roles”表,包含用户名(user_name列)及其相关的角色(role_name列)。 user_name列和role_name列被设置为tomcat_users_roles的主键。 添加外键约束为引用完整性确保tomcat_users_roles中指定的user_name tomcat_users_roles存在于tomcat_users,role_name tomcat_users_roles存在于tomcat_roles中指定。 脚本也插入一些用户名,密码,和角色到数据库表中。
我把脚本放在C:\。 我登录到mysql W 作为根用户登录数据是我的我的。 ini文件)并执行脚本通过:
SOURCE C:\create_tomcat_realm_database.sql
脚本的执行所示:
我会确认表存在通过“使用tomcat_realm;”和“显示表;
use tomcat_realm; show tables;
接下来,我将创建一个Tomcat的用户可以使用它来访问tomcat_realm数据库。 我叫用户“realm_access”。 我将授予用户能够选择从所有的tomcat_realm表。
USE mysql; CREATE USER 'realm_access'@'localhost' IDENTIFIED BY 'realmpass'; GRANT SELECT ON tomcat_realm.* TO realm_access@localhost;
接下来,我将更新我的Tomcat 年代 W 服务器。 xml文件连接到MySQL W 领域的数据库 W 我刚刚创建的。 我就注释掉UserDatabase领域部分。 我将创建一个JDBC W 域条目包含所有正确的信息,如下所示:
... <!-- <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/> --> ... <Realm className="org.apache.catalina.realm.JDBCRealm" driverName="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/tomcat_realm" connectionName="realm_access" connectionPassword="realmpass" userTable="tomcat_users" userNameCol="user_name" userCredCol="password" userRoleTable="tomcat_users_roles" roleNameCol="role_name" /> ...
在这之后,我们需要把MySQL jar W 文件到Tomcat的类路径中 W 这样Tomcat和MySQL数据库。 如果我们不这样做,我们将会收到一条错误消息,当Tomcat启动时,如:
... Jul 6, 2008 4:38:39 PM org.apache.catalina.realm.JDBCRealm start SEVERE: Exception opening database connection java.sql.SQLException: com.mysql.jdbc.Driver at org.apache.catalina.realm.JDBCRealm.open(JDBCRealm.java:689) at org.apache.catalina.realm.JDBCRealm.start(JDBCRealm.java:766) ...
我将添加mysql-connector-java-5.0.4-bin。 jar文件到我的Tomcat的常见/ lib目录中。 当Tomcat启动时,它会找到共同的jar文件/ lib。 然而,(注意,我要通过一个Eclipse运行Tomcat 年代 W 项目,所以我需要MySQL jar文件添加到我的项目的类路径中。 在这不久…)
接下来,我将配置一个Eclipse项目运行在Tomcat中对JDBC使用基本身份验证领域我们设置。 我介绍如何建立一个Eclipse项目运行Tomcat 另一个教程 。 我将为我的“tomcat-demo”项目添加一个内容我的Tomcat服务器。 xml文件。
<Context docBase="C:\projects\workspace\tomcat-demo\web" path="/tomcat-demo" reloadable="true"/>
我的“tomcat-demo”项目的结构如下所示。 该项目包括一个单独的servlet W 。
这里所示的TestServlet类。 它输出一个简单的消息。
package test; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class TestServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("This is the Test Servlet"); } }
项目的web . xml W 文件所示。 它包含一个< servlet >条目测试servlet,< servlet映射>条目,将请求映射到测试servlet /测试。
请注意<安全约束>部分。 本节中指定的任何请求应用程序(“/ *”地图所有请求)要求请求用户认证与一个角色的“家伙”来访问该应用程序。 < auth方法>指定我们将使用基本身份验证。
<?xml version="1.0" encoding="UTF-8"?> <web-app id="tomcat-demo" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <servlet-name>TestServlet</servlet-name> <servlet-class>test.TestServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>TestServlet</servlet-name> <url-pattern>/test</url-pattern> </servlet-mapping> <security-constraint> <web-resource-collection> <web-resource-name>Wildcard means whole app requires authentication</web-resource-name> <url-pattern>/*</url-pattern> <http-method>GET</http-method> <http-method>POST</http-method> </web-resource-collection> <auth-constraint> <role-name>dude</role-name> </auth-constraint> <user-data-constraint> <!-- transport-guarantee can be CONFIDENTIAL, INTEGRAL, or NONE --> <transport-guarantee>NONE</transport-guarantee> </user-data-constraint> </security-constraint> <login-config> <auth-method>BASIC</auth-method> </login-config> </web-app>
我需要将MySQL驱动程序jar添加到项目的构建路径,因为我会从Eclipse运行Tomcat。 我将添加外部jar。 注意到Tomcat罐子已经使用一个Eclipse用户库添加到项目中。 这是覆盖着 另一个教程 。
接下来,我将在Tomcat启动“tomcat-demo”项目 年代 W 在Eclipse中 年代 W 。
在浏览器中,我将试图测试servlet W 通过http://localhost:8080 / tomcat-demo /测试。 因为我们使用基本身份验证,这是一个受保护的资源,会出现一个弹出窗口要求名字和密码。
我会进入一个无效的用户名和密码。 这并不工作。
我将进入一个好名字和密码。 在我们tomcat_realm数据库 W ,我们创建了一个名为“德隆”的用户的密码“deronpass”。 “德隆”用户的角色“老兄”和“经理”。 因为我们的web . xml W 指定用户的角色“家伙”是必需的,“德隆”/“deronpass”应该工作。
用户名和密码进行验证,我们授予访问测试servlet。
在本教程中,我们看到,这是相当简单的设置Tomcat JDBC W 与MySQL域 W 为了执行基于容器的认证。