Tomcatとパスワード認証

 Webアプリケーション上で特定のURL(コンテキストパス) にアクセスするためにパスワード認証を行わせることができます。 認証ページの提供の仕方には、大きく次の2つがあります。

  • Basic認証。Apacheのhtpasswdを使った場合と同様に、 各ブラウザ独自の(固定の形をした)ユーザ名とパスワードを入力できるダイアログが出てきます。
  • FORM認証。Webアプリケーションの開発者がログインのページとリトライ (認証が失敗したとき表示するページ)をHTMLで自由に記述できます。
また、認証するユーザ情報の提供の仕方には、次の3つがあります。
  • MemoryRealm。サーブレットコンテナ側のどこかにXML形式でユーザ名とパスワードを記述しておき、 コンテナが起動するときにこれを読み込んでメモリ上で覚えておく方法です。
  • JDBCRealm。ユーザ名とパスワードをRDBMSのテーブルに持たせておき、 認証の度にJDBCを使って問い合わせる方法です。
  • JNDIRealm。LDAPなどのディレクトリサーバに問い合わせる方法です。
このページではMemoryRealmのみを扱います。 JDBCRealmやJNDIRealmを使う必要がある水準の公開規模のシステムであれば、 ユーザ名とパスワードを入力させ、そのチェックを行う処理を全て Webアプリケーションの一部として実装することも多いと思います。 実際、上記以外の特殊で複雑な認証の仕方をさせたい場合は少しでもある場合には、 (例えばLDAPディレクトリに登録されていないがゲスト用の特殊なユーザも使えるようにしたい、 などのカスタマイズが頻発するような場合) 最初からそのようにしたほうがよい場合もあるでしょう。


Basic認証の記述の仕方

 特定のURLにアクセスするのにBasic認証をかけたい場合は、 それを含むアプリケーションのweb.xmlに次のように書きます。

<?xml version="1.0" encoding="Shift_JIS"?>
<!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>
      <display-name>Example Security Constraint</display-name>
      <web-resource-collection>
         <web-resource-name>Protected Area</web-resource-name>
         <url-pattern>*.html</url-pattern>
         <url-pattern>*.jsp</url-pattern>
         <http-method>DELETE</http-method>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
         <http-method>PUT</http-method>
      </web-resource-collection>
      <auth-constraint>
         <role-name>tomcat</role-name>
      </auth-constraint>
    </security-constraint>

    <login-config>
      <auth-method>BASIC</auth-method>
      <realm-name>BASIC Authentication</realm-name>
    </login-config>
</web-app>

url-patternタグでは上の「*.jsp」のようなパターンのほか、 「/admin/*」のように特定のディレクトリのみを対象にさせることもできます。 ただし、 「/admin/*.jsp」のように、ディレクトリとファイル名パターンを両方使うことはできない (エラーにはならないが、認証が効かない)ようです。
role-nameタグにアクセスを許可するユーザ名またはロール名を列挙します。 ロールとは複数のユーザをまとめてグループにしたようなものです。 ここではtomcatというユーザ、 またはロールに属するユーザが正しいパスワードで認証された場合のみ、 アクセスを許可するようにしています。


FORM認証の記述の仕方

 一方FORM認証の場合のweb.xmlは次のようになります。

<?xml version="1.0" encoding="Shift_JIS"?>
<!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>
      <display-name>Example Security Constraint</display-name>
      <web-resource-collection>
         <web-resource-name>Protected Area</web-resource-name>
         <url-pattern>*.html</url-pattern>
         <url-pattern>*.jsp</url-pattern>
         <http-method>DELETE</http-method>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
         <http-method>PUT</http-method>
      </web-resource-collection>
      <auth-constraint>
         <role-name>tomcat</role-name>
      </auth-constraint>
    </security-constraint>

    <!-- Default login configuration uses form-based authentication -->
    <login-config>
      <auth-method>FORM</auth-method>
      <realm-name>Form-Based Authentication</realm-name>
      <form-login-config>
        <form-login-page>/sec/login.jsp</form-login-page>
        <form-error-page>/sec/error.jsp</form-error-page>
      </form-login-config>
    </login-config>
</web-app>

form-login-pageタグとform-error-pageタグには、それぞれ、 認証が必要になったときに表示し、ユーザ名とパスワードを入力させるHTML文書 (JSPスクリプト)のURLと、認証が失敗した場合に表示するHTML文書のURL を記述します。URLはそのWebアプリケーションのコンテキストパスからの相対参照です。 つまり例えば、このWebアプリケーションが /home/watasi/tomcat/webapps/app1 に配備されている場合、 /sec/login.jsp と書くと /home/watasi/tomcat/webapps/app1/sec/login.jsp を見に行くことになります。

FORM認証のログインページ
認証フォームを出すJSP文書(上の設定でいうlogin.jsp)です。 各INPUTタグの名前ですが、それぞれ「j_username」「j_password」で固定です。

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<html><body>
このページにアクセスするにはログインが必要です。
<form action="<%= response.encodeURL("j_security_check") %>" method="POST">
ユーザ名:
<input type="text" name="j_username" maxlength="8" size="12"><br>
パスワード:
<input type="password" name="j_password" maxlength="8" size="12"><br><br>
<input type="submit" value="ログイン">
</form>
</body></html>

FORM認証のエラーページ
そして、認証に失敗したときに表示するページ、 上の設定でいうerror.jspです。

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<html><body>
おおっと!だめっす。<br><a href="../hello.html">もう一度試す</a><br>
</body></html>


サーブレットコンテナのMemoryRealmの設定

 次にMemoryRealmを実現するために、 サーブレットコンテナのこのアプリケーションの設定に記述を加える必要があります。 この書き方はサーブレットコンテナによって異なります。 これはJakarta Tomcat 4.1.10と4.1.24で試した例で、 $CATALINA_HOME/conf/server.xmlのアプリケーションの定義部分に、 下のようにRealmタグを追加します。

<Context path="/app1" docBase="/usr/watasi/tomcat/app1" debug="0" reloadable="true">
  <Logger className="org.apache.catalina.logger.FileLogger"
          prefix="testapp." suffix=".txt" timestamp="true"/>
<Realm className="org.apache.catalina.realm.MemoryRealm"
       pathname="conf/tomcat-users.xml"/>
</Context>

 この例では、Tomcatをインストールすると自動的に作られる、 $CATALINA_HOME/conf/tomcat-users.xml をそのまま使っています。上のweb.xmlで、ロール「tomcat」 を持ったユーザが要求されていますから、 ログイン画面が現れたときに、ユーザ「tomcat」か「both」でパスワード認証が通れば、 上のアプリケーションが使えるようになるわけです。

<!--
  NOTE:  By default, no user is included in the "manager" role required
  to operate the "/manager" web application.  If you wish to use this app,
  you must define such a user - the username and password are arbitrary.
-->
<tomcat-users>
  <user name="tomcat" password="tomcat" roles="tomcat" />
  <user name="role1"  password="tomcat" roles="role1"  />
  <user name="both"   password="tomcat" roles="tomcat,role1" />
</tomcat-users>

自動的にSSLに移行する
 Basic認証もFORM認証も、 入力されたパスワードはネットワーク上をそのまま又は比較的簡単に解読可能な形で流れるので、 盗聴には弱いという欠点があります。 そこで、認証が必要になるURLへのアクセスにはSSLも一緒に導入ということで、 認証時に自動的にSSL対応に移行する設定も可能です。

<?xml version="1.0" encoding="Shift_JIS"?>
<!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>
      <display-name>Example Security Constraint</display-name>
      <web-resource-collection>
         <web-resource-name>Protected Area</web-resource-name>
         <url-pattern>*.html</url-pattern>
         <url-pattern>*.jsp</url-pattern>
         <http-method>DELETE</http-method>
         <http-method>GET</http-method>
         <http-method>POST</http-method>
         <http-method>PUT</http-method>
      </web-resource-collection>
      <auth-constraint>
         <role-name>tomcat</role-name>
      </auth-constraint>
      <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
      </user-data-constraint>
    </security-constraint>

    <!-- Default login configuration uses form-based authentication -->
    <login-config>
      <auth-method>FORM</auth-method>
      <realm-name>Form-Based Authentication</realm-name>
      <form-login-config>
        <form-login-page>/sec/login.jsp</form-login-page>
        <form-error-page>/sec/error.jsp</form-error-page>
      </form-login-config>
    </login-config>
</web-app>

このtransport-guaranteeタグによって、自動的にSSLに移行します。 もちろん、TomcatがSSLのポートを開いていることが大前提です。

Server Side Java Index Top

(first uploaded 2002/09/21 last updated 2003/07/09, URANO398)

テレワークならECナビ Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!
無料ホームページ 無料のクレジットカード 海外格安航空券 海外旅行保険が無料! 海外ホテル