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

身份驗證能夠由一個web應用程序控制或由容器(好比Tomcat 年代 web應用程序中運行)。 Tomcat容器管理的安全是基於領域。 領域包含了用戶的姓名,密碼,和角色。 html

我配置了Tomcat(5.5.20版)是一個UserDatabase領域一個活躍的領域。 UserDatabase領域使用tomcat用戶。 Tomcat的配置目錄中的xml文件位置的名稱,密碼,和角色數據。 從這個文件將Tomcat啓動時加載數據,而不是在其餘時間。 一般您須要修改這個文件手動更新它,因此它多是在開發過程當中最有用的而不是一個實際生產系統。 java

Tomcat能夠配置爲其餘更健壯的領域選擇。 這樣的一個替代方法是一個JDBC 領域。 JDBC域在UserDatabase域的好處包括可以在運行時動態更新JDBC域數據,而不是隻在啓動時。 在Tomcat的服務器。 xml文件中,咱們能夠看到UserDatabase域註釋而樣本JDBC域爲MySQL 註釋掉: mysql

部分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數據庫 存儲領域的用戶名、密碼和角色。 我在個人機器上已經安裝了MySQL。 我將運行如下create_tomcat_realm_database。 sql腳本建立一個「tomcat_realm」數據庫: web

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域條目。 可是,用戶名稱列第一個表和第二個表的用戶名列須要具備相同的名稱。 sql

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 做爲根用戶登陸數據是個人個人。 ini文件)並執行腳本經過: apache

SOURCE C:\create_tomcat_realm_database.sql

腳本的執行所示: 瀏覽器

SOURCE C:\create_tomcat_realm_database.sql

我會確認表存在經過「使用tomcat_realm;」和「顯示錶; tomcat

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 年代 服務器。 xml文件鏈接到MySQL 領域的數據庫 我剛剛建立的。 我就註釋掉UserDatabase領域部分。 我將建立一個JDBC 域條目包含全部正確的信息,以下所示:

部分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 文件到Tomcat的類路徑中 這樣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 年代 項目,因此我須要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 

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 文件所示。 它包含一個< 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」項目 年代 在Eclipse中 年代 

Tomcat started in Eclipse

在瀏覽器中,我將試圖測試servlet 經過http://localhost:8080 / tomcat-demo /測試。 由於咱們使用基自己份驗證,這是一個受保護的資源,會出現一個彈出窗口要求名字和密碼。

Basic authentication required to access test servlet

我會進入一個無效的用戶名和密碼。 這並不工做。

Entering invalid name and password fails

我將進入一個好名字和密碼。 在咱們tomcat_realm數據庫 ,咱們建立了一個名爲「德隆」的用戶的密碼「deronpass」。 「德隆」用戶的角色「老兄」和「經理」。 由於咱們的web . xml 指定用戶的角色「傢伙」是必需的,「德隆」/「deronpass」應該工做。

Entering valid name and password

用戶名和密碼進行驗證,咱們授予訪問測試servlet。

User is authenticated and granted access to the protected resource

在本教程中,咱們看到,這是至關簡單的設置Tomcat JDBC 與MySQL域 爲了執行基於容器的認證。

相關文章
相關標籤/搜索