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

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

FORM認証

ここでは、Tomcatで用意されている認証方法の中からFORM認証について解説します。Tomcatで用意されている認証方法の概要についてはJavaの道:Tomcat(BASIC認証)に記載していますため、そちらを参照してください。

実行環境
  • ・WindowsXP Home Edition
  • ・Tomcat 5.0.18
  • ・J2SDK 1.4.2_03

FORM認証の概要

FORM認証とはセキュリティが必要なファイルにアクセスがあった場合、あらかじめ用意しているログイン画面を表示し、認証を行う認証方式です。BASIC認証との違いはBASIC認証はログイン画面としてブラウザで用意されているダイアログを表示するのに対して、FORM認証はカスタマイズ可能なFORM画面を表示することです。

ここではレルム方式としてUserDatabaseレルムを使用した方法で、FORM認証を解説します。

UserDatabaseレルムの設定

UserDatabaseレルムの設定は<Realm>タグにより行います。<Realm>タグは<Engine>タグ、<Host>タグ、<Context>タグのサブ要素として指定できます。UserDatabaseレルムの設定で指定できる<Realm>タグの属性を以下に記載します。

属性 内容 デフォルト 必須
class
Name
UserDatabaseレルムを担うJavaクラスを指定。org.apache.catalina.realm.UserDatabaseRealmを指定する。 -
debug 生成されるログレベルを指定する。数字が大きいほど詳細なログが生成される。最低は0、最高は99。 0 -
resour
ceName
<Resource>タグ、<ResourceParams>タグで指定されているJNDIリソースを参照するキーワードを指定する。 -

UserDatabaseレルムはデフォルトで<Engine>タグ配下に設定されています。server.xmlファイルに設定されているUserDatabaseレルムの設定は以下のようになっています。

<Engine name="Catalina" defaultHost="localhost" debug="0">

    <Logger className="org.apache.catalina.logger.FileLogger"
            prefix="catalina_log."
            suffix=".txt"
            timestamp="true"
        />
    
    <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
           debug="0"
           resourceName="UserDatabase"
        />
    
    ・・・・・・・・・・・・・・・・・・・・・・・・・
    ・・・・・・・・・・・・・・・・・・・・・・・・・ 

1.resourceName属性にJNDIリソースを参照するキーワード
UserDatabaseを指定しています。JNDIリソースとして設定されたUserDatabaseの設定もデフォルトで行われています。server.xmlファイルにその設定があり、以下に記載します。JNDIリソースの設定の中でJNDIリソースを参照するキーワードがUserDatabaseであること、ID、パスワード、ロールの参照先としてtomcat-users.xmlファイルが指定されていることなどがわかります。

<Resource name="UserDatabase"
        auth="Container" type="org.apache.catalina.UserDatabase"
        description="User database that can be updated and saved" />

<ResourceParams name="UserDatabase">
    <parameter>
        <name>factory</name>
        <value>org.apache.catalina.users.MemoryUserDatabaseFactory</value>
    </parameter>
    <parameter>
        <name>pathname</name>
        <value>conf/tomcat-users.xml</value>
    </parameter>
</ResourceParams>

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. <url-pattern>タグにFORM認証を行うリソースを指定します。/*でweb.xmlを設置するコンテキスト内のすべてのリソースに認証が必要なように設定します。
  3. <auth-method>タグには認証方式を指定します。今回はFORM認証を使うため、FORMと設定します。
  4. <form-login-config>タグには認証の際表示されるログイン画面「login.jsp」と、エラー画面「login_err.html」を指定します。

ログイン画面、エラー画面の作成

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>

ID、パスワード、ロールの設定

ID、パスワード、ロールの設定はUserDatabaseレルムを使用する場合は$CATALINA_HOME\confディレクトリ配下のtomcat-users.xmlファイルで行います。オレンジ色の文字の箇所が今回設定した箇所です。

tomcat-users.xml

<?xml version='1.0' encoding='utf-8'?>

<tomcat-users>
    <role rolename="tomcat"/>
    <role rolename="role1"/>
    <role rolename="manager"/>
    <role rolename="admin"/>
    <role rolename="form"/>
    <user username="tomcat" password="tomcat" roles="tomcat"/>
    <user username="both" password="tomcat" roles="tomcat,role1"/>
    <user username="role1" password="tomcat" roles="role1"/>
    <user username="admin" password="admin" roles="admin,manager"/>
    <user username="java" password="road" roles="form"/>
</tomcat-users>
  1. <role>タグに設定するロールを記載します。ここでは先ほどweb.xmlファイルの<role-name>タグで指定したformロールを設定します。
  2. <user>タグに認証に使用するID、パスワード、ロールを指定します。username、password、rolesのそれぞれの属性にID「java」、パスワード「road」、ロール「form」と指定します。

動作確認

  1. ファイルの配置
    これまで作成したファイルを該当箇所に配置します。tomcat-users.xmlは元々ある$CATALINA_HOME\conf配下のファイルを変更しますため、配置の必要はありません。web.xml、login.jsp、login_err.html、login.htmlは該当するコンテキストに配置します。コンテキストのディレクトリとして$CATALINA_HOME\webapps配下にFormAuthディレクトリを作成します。その配下にweb.xml、login.jsp、login_err.html、login.htmを配置します。配置箇所は以下のようになります。

    ファイルの配置
  2. ファイルアクセス
    それぞれの設定を行った後、Tomcatを起動し、 http://localhost:8080/FormAuth/login.htmlにアクセスします。ログイン画面が表示されます。IDに「java」、Passに「road」と入力し、「Login」ボタンを押すと、「ログイン成功です。」と記載されたHTMLファイルが表示されます。誤ったID、Passwordを入力するとエラー画面が表示されます。

    ログイン画面

    FORM認証のログイン画面

    ログイン成功画面

    FORM認証のログイン成功画面

    エラー画面

    FORM認証のエラー画面

12FORM認証