Javaに関する様々な情報をご紹介します。

13JDBCレルムによるFORM認証

Javaに関する様々な情報をご紹介します。

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基本設定値

設定項目 設定値
データベース名 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
pauth_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://dev.mysql.com/downloads/connector/j/から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 必須

タグのサブ要素

要素 内容 デフォルト 要素数
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. ファイルの配置
    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. ファイルアクセス
    2.ファイルアクセス それぞれの設定を行った後、MySQL、Tomcatを起動し、 http://localhost:8080/JDBCAuth/login.htmlにアクセスします。ログイン画面が表示されます。IDに「java」、Passに「road」と入力し、「Login」ボタンを押すと、「ログイン成功です。」と記載されたHTMLファイルが表示されます。誤ったID、Passwordを入力するとエラー画面が表示されます。

    ログイン画面

    JDBCレルムによるFORM認証のログイン画面

    ログイン成功画面

    JDBCレルムによるFORM認証のログイン成功画面

    エラー画面

    JDBCレルムによるFORM認証のエラー画面

13JDBCレルムによるFORM認証