身份驗證能夠由一個web應用程序控制或由容器(好比Tomcat 年代 W web應用程序中運行)。 Tomcat容器管理的安全是基於領域。 領域包含了用戶的姓名,密碼,和角色。 html
我配置了Tomcat(5.5.20版)是一個UserDatabase領域一個活躍的領域。 UserDatabase領域使用tomcat用戶。 Tomcat的配置目錄中的xml文件位置的名稱,密碼,和角色數據。 從這個文件將Tomcat啓動時加載數據,而不是在其餘時間。 一般您須要修改這個文件手動更新它,因此它多是在開發過程當中最有用的而不是一個實際生產系統。 java
Tomcat能夠配置爲其餘更健壯的領域選擇。 這樣的一個替代方法是一個JDBC W 領域。 JDBC域在UserDatabase域的好處包括可以在運行時動態更新JDBC域數據,而不是隻在啓動時。 在Tomcat的服務器。 xml文件中,咱們能夠看到UserDatabase域註釋而樣本JDBC域爲MySQL W 註釋掉: mysql
... <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」數據庫: web
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 W 做爲根用戶登陸數據是個人個人。 ini文件)並執行腳本經過: apache
SOURCE C:\create_tomcat_realm_database.sql
腳本的執行所示: 瀏覽器
我會確認表存在經過「使用tomcat_realm;」和「顯示錶; tomcat
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。