TomcatでBASIC認証する

既に作成済みのJSPに、UserDatabaseRealmを使用したBASIC認証の機能を追加します。


UserDatabaseRealm

UserDatabaseRealmは、静的なファイルからTomcat起動時にメモリへ読み込まれます。したがってユーザ名やパスワードはTomcat起動時点のものとなり、Tomcat起動中には更新されません。
したがって、このRealmは小規模なWebアプリケーション、もしくはテスト運用向けです。


BASIC認証

BASIC認証で保護されているWebアプリケーションが呼ばれた時点で、Tomcatはブラウザに対してHTTPのBASIC認証で認証を行います。ただしこの認証はパスワードが暗号化されずにネットワークを流れてしまうため、HTTPSVPNと組み合わせて使用する必要があります。


ディレクトリ構造

使用環境はTomcat5。JSPを置いてあるディレクトリの構造は以下のとおりです。

TomcatHome
   +--auth
       +-- WEB-INF
       |     +-- (web.xml)
       +-- hogedb
	     +-- (hogedb.jsp)

レルムの指定

レルムの指定は「server.xml」のファイルに記述します。このファイルはTomcatがインストールされたディレクトリに格納されています。私の環境の場合/etc/tomcat5です。
このxmlを見てみると、殆どの部分はコメントアウトされていて、有効になっているレルムは「UserDatabasedRealm」だけです。

      <!-- This Realm uses the UserDatabase configured in the global JNDI
           resources under the key "UserDatabase".  Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm.  -->
      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>

      <!-- Comment out the old realm but leave here for now in case we
           need to go back quickly -->


clasNameは固定の値で、resouceNameだけを指定します。デフォルトで「UserDatabase」が指定されていて、同じ「server.xml」でリソースの定義がしてあります。

属性 内容
className 必須 Javaクラス名の指定。デフォルトのorg.apache.catalina.realm.UserDatabaseRealmを指定する
resouceName 必須 ユザー情報ファイルの所在を記載したJNDIリソース名を指定する
debag 省略可 デバッグレベルの指定。
digest 省略可 デフォルトでcleatext

ここで、ユーザー情報を定義したファイルの指定を行なっています。デフォルトで「tomucat-users.xml」が指定してあり、この「server.xml」と同じディレクトリに置いてあります。

  <!-- Global JNDI resources -->
  <GlobalNamingResources>

    <!-- Test entry for demonstration purposes -->
    <Environment name="simpleValue" type="java.lang.Integer" value="30"/>

    <!-- Editable user database that can also be used by
         UserDatabaseRealm to authenticate users -->
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
       description="User database that can be updated and saved"
           factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
          pathname="conf/tomcat-users.xml" />

  </GlobalNamingResources>

tomucat-users.xmlの設定

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="role1" password="tomcat" roles="role1"/>
</tomcat-users>

ここでの記述は、既に書かれている例を参考に、roleとuserを記述します。



web.xmlの設定

最後にweb.xmlを編集します。

<?xml version="1.0" encoding="ISO-8859-1"?>
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
   http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">

  <servlet>
    <servlet-name>AuthTest1</servlet-name>
    <jsp-file>/Auth/hogedb/hogedb.jsp</jsp-file>
    <load-on-startup>1</load-on-startup>
  </servlet>

  <servlet-mapping>
    <servlet-name>AuthTest1</servlet-name>
    <url-pattern>/Auth/hogedb/hogedb.jsp</url-pattern>
  </servlet-mapping>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>hogedb</web-resource-name>
      <url-pattern>/*</url-pattern>
      </web-resource-collection>
    <auth-constraint>
      <role-name>hogeStaff</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>hogeWebApp</realm-name>
  </login-config>

  <security-role>
    <role-name>hogeStaff</role-name>
  </security-role>
</web-app>

要素のhogeStaff
要素のhogeStaff
でそれぞれロールを設定します。


以上で設定完了です。UserDatabaseRealmなので、Tomcatを再起動してJSPにアクセスしてみます。
以下のような認証ウィンドウが出て、tomucat-users.xmlで設定したユーザー名とパスワードを入力します。

上手く行けば、目的のJSPが表示されます。


java drive http://www.javadrive.jp/servlet/auth/