Javaの道 Javaに関する
 ニュースJava基本Servlet・JSPオープンソースFAQ掲示板
Javaの道 > オープンソース > Tomcat −10.FORM認証
更新日:2006/4/16
Tomcat−10.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>タグの属性を以下に記載します。
属性
内容
デフォルト
必須
className
UserDatabaseレルムを担うJavaクラスを指定。org.apache.catalina.realm.UserDatabaseRealmを指定する。
-
debug
生成されるログレベルを指定する。数字が大きいほど詳細なログが生成される。最低は0、最高は99。
0
-
resourceName
<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. <role-name>タグで認証を許可するロールを指定します。ここではformと指定します。formロールに属するIDのみが認証可能になります。
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認証のエラー画面



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