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

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

BASIC認証

ここでは、Tomcatで用意されている認証方法の概要及び、その中からBASIC認証について解説します。

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

認証方法の概要

Tomcatで用意されている認証方法を理解するうえで重要な要素として、レルム方式と認証方式があります。レルム方式とは認証を行う際のID、パスワード、ロール情報にアクセスする際のアクセス方法です。認証方式とはどのようにして認証を行うかという認証手段です。レルム方式と認証方式を組み合わせてTomcat上での認証を実現します。以下にTomcatで提供されているレルム方式、認証方式について解説します。

レルム方式

メモリレルム
ID、パスワード、ロールをメモリに読み込み、認証時に使用します。読み込まれる情報はtomcat-users.xmlファイルに記載されています。手軽に利用できますが、現在はメモリレルムの上位仕様としてリリースされたUserDatabaseレルムがよく使用されます。
UserDatabaseレルム
Tomcatでデフォルトで設定されているレルム方式です。ID、パスワード、ロールはメモリレルムと同様にtomcat-users.xmlファイルの情報を使用します。UserDatabaseの情報はメモリ内に格納されています。メモリレルムと異なりUserDatabaseに対して行った変更は、変更情報としてtomcat-users.xmlファイルに書き込まれます。
JDBCレルム
ID、パスワード、ロールをデータベースに格納し、JDBC経由で認証を行います。
JNDIレルム
NIS、ActiveDirectoryなどのディレクトリサービスにID、パスワード、ロールを格納し、JNDI経由で認証を行います。
DataSourceレルム
ID、パスワード、ロールを格納したデータベースにJDBC経由で接続し、認証を行います。JDBCへの接続にJNDIルックアップを使用します。

認証方式

BASIC認証
HTTPで広く普及している認証方式です。ID、パスワードは暗号化されず、平文で送信されます。
DIGEST認証
BASIC認証の欠点を補い、パスワードを暗号化して認証を行います。
FORM認証
認証画面にブラウザ標準のダイアログではなく、カスタマイズ可能なHTMLのFORM画面が使用します。
SSL認証
クライアント証明書を使用して認証を行います。

今回の解説では、「UserDatabaseレルム」と「BASIC認証」を利用して認証を行う方法について解説します。「UserDatabaseレルム」は認証情報をtomcat-users.xmlというXMLファイルで管理するためあまり大規模システムには向いていません。大規模システムで認証を行う場合は「JDBCレルム」、「JNDIレルム」の利用を検討してください。

Tomcatの認証ではID、パスワードの他にロールという要素を使用します。ロールはIDをグループ化するものです。認証を使用するアプリケーションに認証可能なロールを設定することにより、そのロールに属するIDを認証対象とすることができます。これによりIDの変化と、アプリケーションの変化を分離できます。IDの変更の際、IDとロールの組み合わせを変えるだけで、アプリケーションに影響を与えることがなくなります。 アプリケーションと認証可能なロールの設定は、認証方式を設定する際のweb.xmlファイルで行います。詳細は後述します。

認証方法

UserDatabaseレルムの設定

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

属性 内容 デフォルト 必須
class
Name
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>

アプリケーションの準備

BASIC認証の動作確認のため、アプリケーションの準備を行います。

  1. 認証後に閲覧されるファイルを作成します。ここでは、簡単に「ログイン成功です。」と表示されるHTMLファイルを作成します。

    login.html

    <html>
    <head><title>login successful</title></head>
    <body>
    
    ログイン成功です。
    
    </body>
    </html>

  2. 今回の動作確認で使用するコンテキストを作成します。$CATALINA_HOME\webapps配下にBasicAuthディレクトリを作成します。BasicAuthディレクトの中に、WEB-INFディレクトリ、web.xmlファイルを作成し、作成したlogin.htmlファイルを配置します。配置後のディレクトリ構成は以下のようになります。

    配置

BASIC認証の設定

BASIC認証の設定は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の設定は以下のようになります。$CATALINA_HOME\webapps\BasicAuth\WEB-INFディレクトリ配下に設置した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 BasicAuth
            </web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>basic</role-name>
        </auth-constraint>
    </security-constraint>

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

</web-app>
  1. <url-pattern>タグにBASIC認証を行うリソースを指定します。/*でBasicAuthコンテキストのすべてのリソースに認証が必要なように設定します。
  2. <role-name>タグで認証を許可するロールを指定します。ここではbasicと指定します。basicロールに属するIDのみが認証可能になります。
  3. <auth-method>タグには認証方式を指定します。今回はBASIC認証を使うため、BASICと設定します。
  4. <realm-name>タグにはBASIC認証で使用するレルム方式を指定します。今回はUserDatabaseレルムを使用するためUserDatabaseRealmと指定します。

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

動作確認

それぞれの設定を行った後、Tomcatを起動し、 http://localhost:8080/BasicAuth/login.htmlにアクセスします。BASIC認証のダイアログが現れ、ID「java」、パスワード「road」入力後、「ログイン成功です。」と記載されたHTMLファイルが表示されると正常な動作が行われています。

動作確認1
動作確認2

11BASIC認証