当前位置: > Linux服务器 > Tomcat >

我如何使用JDBC和Tomcat和MySQL域吗?

时间:2016-05-29 22:14来源:linux.it.net.cn 作者:IT

身份验证可以由一个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 注释掉:

部分Tomcat的服务器。 xml文件

...
      <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”数据库:

create_tomcat_realm_database.sql

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

脚本的执行所示:

SOURCE C:\create_tomcat_realm_database.sql

我会确认表存在通过“使用tomcat_realm;”和“显示表;

use tomcat_realm;
show tables;
verifying tables exist

接下来,我将创建一个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;

creating 'realm_access' user

 

接下来,我将更新我的Tomcat 年代 W 服务器。 xml文件连接到MySQL W 领域的数据库 W 我刚刚创建的。 我就注释掉UserDatabase领域部分。 我将创建一个JDBC W 域条目包含所有正确的信息,如下所示:

部分Tomcat的服务器。 xml文件

...
      <!--
      <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启动时,如:

例外的例子发生在MySQL jar文件并没有被添加到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文件添加到我的项目的类路径中。 在这不久…)

MySQL jar file added to Tomcat's common/lib directory

接下来,我将配置一个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 。

tomcat-demo project

这里所示的TestServlet类。 它输出一个简单的消息。

TestServlet.java

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方法>指定我们将使用基本身份验证。

web . xml

<?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用户库添加到项目中。 这是覆盖着 另一个教程 。

MySQL jar file added to project build path

 

 

接下来,我将在Tomcat启动“tomcat-demo”项目 年代 W 在Eclipse中 年代 W 。

Tomcat started in Eclipse

在浏览器中,我将试图测试servlet W 通过http://localhost:8080 / tomcat-demo /测试。 因为我们使用基本身份验证,这是一个受保护的资源,会出现一个弹出窗口要求名字和密码。

Basic authentication required to access test servlet

我会进入一个无效的用户名和密码。 这并不工作。

Entering invalid name and password fails

我将进入一个好名字和密码。 在我们tomcat_realm数据库 W ,我们创建了一个名为“德隆”的用户的密码“deronpass”。 “德隆”用户的角色“老兄”和“经理”。 因为我们的web . xml W 指定用户的角色“家伙”是必需的,“德隆”/“deronpass”应该工作。

Entering valid name and password

用户名和密码进行验证,我们授予访问测试servlet。

User is authenticated and granted access to the protected resource

在本教程中,我们看到,这是相当简单的设置Tomcat JDBC W 与MySQL域 W 为了执行基于容器的认证。




(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容