Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > オープンソース > Tomcat −11.JDBCレルムによるFORM認証
更新日:2006/4/16
Tomcat−11.JDBCレルムによるFORM認証
ここでは、Tomcatで用意されている認証方法の中からJDBCレルムを使用したFORM認証について解説します。Tomcatで用意されている認証方法の概要についてはJavaの道:Tomcat(BASIC認証)に記載していますため、そちらを参照してください。

実行環境
・WindowsXP Home Edition
・Tomcat 5.0.18
・J2SDK 1.4.2_04
・MySQL 4.0.18
・MySQL Connector/J 3.0
JDBCレルムによるFORM認証の概要
JDBCレルムによるFORM認証とは、レルム方式にJDBCを使用し、データベースに格納されたID、パスワード、ロールを使用して認証を行う方法です。これまで説明したBASIC認証、FORM認証ではレルム方式にUserDatabaseレルムを使用していました。UserDatabaseレルムはメモリに格納されたID、パスワード、ロールを認証に使用します。そのため、大規模システムの認証には向いていません。大規模システムの認証にはJDBCレルムを使用します。

認証方式としては、その名前のとおりFORM認証を使用します。FORM認証では認証に使用されるログイン画面を自由にカスタマイズできます。
MySQLの設定
今回はデータベースとしてMySQLを使用します。JDBCレルムを使用するために、MySQLに設定するMySQLユーザ、データベース、テーブルについて解説します。MySQLの操作方法についてはここでは省略します。以下のURLを参照するなどしてMySQLの設定を行ってください。

MySQL日本語ドキュメント:http://www.mysql.com/doc/ja/index.html
@IT:快速MySQLでデータベースアプリ!
【MySQL基本設定値】
設定項目
設定値
データベース名
auth
ユーザID
myuser
パスワード
mypass
テーブル名1
auth_users
テーブル名2
auth_roles
データベース名、MySQLユーザ名、テーブル名はserver.xmlで自由に設定できます。任意の名前で作成できます。
【auth_usersテーブル】
カラム名
データ型
データ値
user_name
varchar(10)
java
user_pass
varchar(10)
road
auth_usersテーブルはID、Passwordを入力するテーブルです。IDを入力するカラムとして「user_name」、Passwordを入力するカラムとして「user_pass」を設定しています。カラム名、データ型は任意の値を設定できます。ここではデータ値として、user_nameカラムに「java」、user_passカラムに「road」を設定しています。
【auth_rolesテーブル】
カラム名
データ型
データ値
user_name
varchar(10)
java
role_name
varchar(10)
form
auth_rolesテーブルはID、ロールを入力するテーブルです。IDを入力するカラムとして「user_name」、Passwordを入力するカラムとして「role_name」を設定しています。IDを入力するかカラム名はauth_usersテーブルと、auth_rolesテーブルで同一である必要があります。カラム名、データ型は任意の値を設定できます。ここではデータ値として、user_nameカラムに「java」、role_nameカラムに「form」を設定しています。
JDBCの設定
MySQLのJDBCライブラリとして「MySQL Connector/J」という製品を使用します。ここではJDBCライブラリのインストール、設定方法について解説します。

1.ダウンロード
http://www.mysql.com/downloads/api-jdbc.htmlからConnector/JのProduction Releaseをダウンロードします。執筆時点の最新版はVer 3.0です。
MySQL Connector/J ダウンロード
2.設置
ダウンロードしたファイル「mysql-connector-java-3.0.11-stable.zip」を解凍して、その中から「mysql-connector-java-3.0.11-stable-bin.jar」を$CATALINA_HOME\common\libディレクトリ配下に設置します。 これでJDBCの設定の終了です。
JDBCレルムの設定
UserDatabaseレルムの設定は<Realm>タグにより行います。<Realm>タグは<Engine>タグ、<Host>タグ、<Context>タグのサブ要素として指定できます。JDBCレルムの設定で指定できる<Realm>タグの属性を以下に記載します。
属性
内容
デフォルト
必須
className
JDBCレルムを担うJavaクラスを指定。org.apache.catalina.realm.JDBCRealmを指定する。
-
connectionName
データベースに接続するユーザID
-
connectionPassword
データベースに接続するPassword
-
connectionURL
JDBCライブラリに接続するためのJDBC準拠のURLを指定。
-
digest
ID、Passwordを暗号化する暗号方式(SHA、MD2、MD5など)の指定。暗号方式のすべての設定値はjava.security.MessageDigestクラスのJavaDocを参照。指定した場合はデータベースに保存しているデータも同じ方式で暗号化されている必要がある。
- -
driverName
JDBCドライバのJavaクラスを指定。MySQL Connector/Jの場合は、org.gjt.mm.mysql.Driverになる。
-
roleNameCol
ロールの情報を格納するカラム名を指定。
-
userCredCol
Passwordの情報を格納するカラム名を指定。
-
userNameCol
IDの情報を格納するカラム名を指定。
-
userRoleTable
userNameColカラムと、roleNameColカラムが設定されているテーブル名を指定。
-
userTable
userNameColカラムと、userCredColカラムが設定されているテーブル名を指定。
-
JDBCレルムを<Engine>タグ配下に設定します。この設定により、TomcatエンジンすべてでJDBCレルムが有効になります。JDBCレルムを設定する前に、デフォルトで設定されているUserDatabaseレルムをコメントアウトします。UserDatabaseレルムの設定はserver.xmlの<Engine>タグ配下にあります。JDBCレルムの設定は以下のようになります。
<Engine name="Catalina" defaultHost="localhost" debug="0">
  <Logger className="org.apache.catalina.logger.FileLogger"
          prefix="catalina_log."
          suffix=".txt"
          timestamp="true"
  />

  <!--←UserDatabaseレルムの設定をコメントアウトする。
  <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
         debug="0"
         resourceName="UserDatabase"
  />
  -->

  <!-- JDBCレルムの設定 -->
  <Realm className="org.apache.catalina.realm.JDBCRealm"
         connectionName="myuser"
         connectionPassword="mypass"
         connectionURL="jdbc:mysql://localhost/auth"
         driverName="org.gjt.mm.mysql.Driver"
         roleNameCol="role_name"
         userCredCol="user_pass"
         userNameCol="user_name"
         userRoleTable="auth_roles"
         userTable="auth_users"
  />
                  
FORM認証の設定
FORM認証の設定はweb.xmlファイルに<security-constraint>タグ、<login-config>タグを設定することで行います。それぞれのタグで設定できる要素を以下に記載します。
【<security-constraint>タグのサブ要素】
要素
内容
デフォルト
要素数
display-name
GUIツールで表示に使用される名前を指定。
- 0以上
web-resource-collection
認証で保護されるリソースを指定する。
- 1以上
web-resource-name
web-resource-collectionのサブ要素。保護されるリソースの名前を指定。
- 必須
description
web-resource-collectionのサブ要素。保護されるリソースの説明を記載。
- 0以上
url-pattern
web-resource-collectionのサブ要素。保護されるリソースをURLパターンで指定。このパターンに属するリソースが保護の対象になる。/*はすべてのリソースを意味する。
- 1以上
http-method
web-resource-collectionのサブ要素。保護するHTTP METHODを指定する。GET、POST、DELETE、PUTなどを指定。
すべて 0以上
auth-constraint
アクセスを許可するロールを指定する。
- optional
description
auth-constraintのサブ要素。許可するロールの説明を記載。
- 0以上
role-name
auth-constraintのサブ要素。アクセスを許可するロールを指定する。*を指定するとすべてのアクセスの許可を意味する。何も指定しない場合はすべてのアクセスの拒否を意味する。
- 0以上
user-data-constraint
送受信されるデータの保証有無を指定する。
- optional
description
user-data-constraintのサブ要素。送受信されるデータの保証有無の説明を記載。
- 0以上
transport-guarantee
user-data-constraintのサブ要素。送受信されるデータの保証有無を指定する。NONEはデータに対し何の保証も与えられないことを表す。INTEGRALはデータが改ざんされていないことを表す。CONFIDENTIALは第三者からのデータ閲覧がないことを表す。INTEGRAL、CONFIDENTIALを指定すると、データの送受信はSSLを使用して行われる。
NONE 必須
【<login-config>タグのサブ要素】
要素
内容
デフォルト
要素数
auth-method
認証方式を指定する。BASIC、DIGEST、FORM、CLIENT-CERT、ベンダ独自仕様のいずれかが指定できる。
- optional
realm-name
BASIC認証を指定した場合に使用する、レルム方式を指定する。
- optional
form-login-config
FORM認証を指定した場合に使用するログインページ、エラーページを指定する。
- optional
form-login-page
form-login-configのサブ要素。ログインページを指定する。
- 必須
form-error-page
form-login-configのサブ要素。エラーページを指定する。
- 必須
今回の解説で使用するweb.xmlの設定は以下のようになります。
【web.xml】
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD 
          Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Authentication of FormAuth</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>form</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>FORM</auth-method>
    <form-login-config>
      <form-login-page>/login.jsp</form-login-page>
      <form-error-page>/login_err.html</form-error-page>
    </form-login-config>
  </login-config>

</web-app>
                  
1. <url-pattern>タグにFORM認証を行うリソースを指定します。/*でweb.xmlを設置するコンテキスト内のすべてのリソースに認証が必要なように設定します。
2. <role-name>タグで認証を許可するロールを指定します。ここではformと指定します。formロールに属するIDのみが認証可能になります。
3. <auth-method>タグには認証方式を指定します。今回はFORM認証を使うため、FORMと設定します。
4. <form-login-config>タグには認証の際表示されるログイン画面「login.jsp」と、エラー画面「login_err.html」を指定します。
ログイン画面、エラー画面の作成
JDBCレルムによるFORM認証で使用するログイン画面(login.jsp)、エラー画面(login_err.html)を作成します。
【login.jsp】
<html>
<head><title>login page</title></head>
<body>

<form method="post" action='<%= response.encodeURL("j_security_check")%>'>
<table>
  <tr>
    <td>ID</td>
    <td> <input type="text" name="j_username"></td>
  </tr>
  <tr>
    <td>Pass</td>
    <td><input type="password" name="j_password"></td>
  </tr>
</table>
<br>
<input type="submit" value="Login" name="submit">
<input type="reset" value="Reset" name="reset">
</form>

</body>
</html>
1. FORMタグのaction属性はj_security_checkでなければなりません。
2. IDを入力するテキストボックスのname属性はj_usernameでなければなりません。
3. Passwordを入力するテキストボックスのname属性はj_passwordでなければなりません。
【login_err.html】
<html>
<head><title>login error page</title></head>
<body>

ID、Passwordが誤っています。

</body>
</html>
1. エラー画面は単に、「ID、Passwordが誤っています。 」のメッセージを表示するのみの画面です。
ログインが成功したか確認するため、ログイン後に表示される画面(login.html)を作成します。ログインが成功した場合、「ログイン成功です。」という文字列を表示します。
【login.html】
<html>
<head><title>login successful</title></head>
<body>

ログイン成功です。

</body>
</html>
動作確認
1.ファイルの配置
これまで作成したファイルを該当箇所に配置します。server.xmlは元々ある$CATALINA_HOME\conf配下のファイルを変更しますため、配置の必要はありません。web.xml、login.jsp、login_err.html、login.htmlは該当するコンテキストに配置します。コンテキストのディレクトリとして$CATALINA_HOME\webapps配下にJDBCAuthディレクトリを作成します。その配下にweb.xml、login.jsp、login_err.html、login.htmを配置します。配置箇所は以下のようになります。
ファイルの配置
2.ファイルアクセス
それぞれの設定を行った後、MySQL、Tomcatを起動し、 http://localhost:8080/JDBCAuth/login.htmlにアクセスします。ログイン画面が表示されます。IDに「java」、Passに「road」と入力し、「Login」ボタンを押すと、「ログイン成功です。」と記載されたHTMLファイルが表示されます。誤ったID、Passwordを入力するとエラー画面が表示されます。
【ログイン画面】
JDBCレルムによるFORM認証のログイン画面
【ログイン成功画面】
JDBCレルムによるFORM認証のログイン成功画面
【エラー画面】
JDBCレルムによるFORM認証のエラー画面



このページのトップへ
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道_CopyrightJavaの道