BASIC認証(UserDatabaseRealmレルム)

広告

次に認証を行うユーザーの管理方法について確認します。ユーザーの管理方法をレルムと言います。

レルムの指定は「server.xml」ファイルに記述します。このファイルは「(Tomcatがインストールされたディレクトリ)\Tomcat 5.5\conf\」ディレクトリにあります。

レルムに関する部分だけを抜粋してみます。

<!-- Define the top level container in our container hierarchy -->
<Engine name="Catalina" defaultHost="localhost">

  <!-- 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 -->
  <!--
  <Realm className="org.apache.catalina.realm.MemoryRealm" />
  -->

  <!-- Replace the above Realm with one of the following to get a Realm
       stored in a database and accessed via JDBC -->

  <!--
  <Realm  className="org.apache.catalina.realm.JDBCRealm"
         driverName="org.gjt.mm.mysql.Driver"
      connectionURL="jdbc:mysql://localhost/authority"
     connectionName="test" connectionPassword="test"
          userTable="users" userNameCol="user_name" userCredCol="user_pass"
      userRoleTable="user_roles" roleNameCol="role_name" />
  -->

  <!--
  <Realm  className="org.apache.catalina.realm.JDBCRealm"
         driverName="oracle.jdbc.driver.OracleDriver"
      connectionURL="jdbc:oracle:thin:@ntserver:1521:ORCL"
     connectionName="scott" connectionPassword="tiger"
          userTable="users" userNameCol="user_name" userCredCol="user_pass"
      userRoleTable="user_roles" roleNameCol="role_name" />
  -->

  <!--
  <Realm  className="org.apache.catalina.realm.JDBCRealm"
         driverName="sun.jdbc.odbc.JdbcOdbcDriver"
      connectionURL="jdbc:odbc:CATALINA"
          userTable="users" userNameCol="user_name" userCredCol="user_pass"
      userRoleTable="user_roles" roleNameCol="role_name" />
  -->
</Engine>

いくつかのレルムが記述されていますが、ほとんどはコメントになっており有効になっているレルムは次の1つだけです。

<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
       resourceName="UserDatabase"/>

デフォルトで有効になっているレルムは「UserDatabaseRealm」レルムです。

データベース経由で利用する場合は「JDBCRealm」に関するレルム(MySQL、Oracle、ODBCの3つが参考までに記載されてコメントになっています)の1つを有効にし、「UserDatabaseRealm」レルムに書かれた部分をコメントにします。こちらは別のページで確認します。

今回はまず「UserDatabaseRealm」レルムの使い方を詳しく見ていきます。

UserDatabaseRealmレルム

「UserDatabaseRealm」レルムはユーザー情報をファイルで管理する方法でテスト用など一時的に利用する場合に便利な方式です。逆に本格的な利用にはあまり向いていません。

設定できる属性は次の通りです。

属性内容
classNameJavaクラス名の指定。「org.apache.catalina.realm.UserDatabaseRealm」を指定します。
resourceNameユーザー情報ファイルの所在を記載したJNDIリソース名の指定する。
debugデバッグレベル。省略可能でデフォルトは0、最大は99。数値が大きくなると詳細になる。
digestダイジェストアルゴリズム。SHA、MD2、MD5を指定する。省略可能でデフォルトはcleartext。

「className」は固定の値ですので、後はリソース名を指定して、細かい設定はリソースの方で記述します。デフォルトでは「UserDatabase」リソースが指定されており、同じ「server.xml」ファイルでリソースの定義がされています。

<GlobalNamingResources>

  <!-- 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>

この中でユーザー情報を定義したファイルの場所を指定するのが「pathname」です。デフォルトでは「(Tomcatがインストールされたディレクトリ)\Tomcat 5.5\conf\」ディレクトリに含まれてる「tomcat-users.xml」ファイルです。このファイル内にユーザー名、パスワード、ロールを指定していきます。

tomcat-users.xmlファイル

「tomcat-users.xml」ファイルはXML形式のテキストファイルです。テキストエディタで開いて見てください。

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

デフォルトでは上記のようになっていると思います。「admin」のアカウントはTomcatをインストールした際に設定した管理者用アカウントとパスワードが設定されているはずです。(上記ではパスワードは伏字にしてありますが実際なそのまま記述されています)。

設定する属性は「role」と「user」です。

属性の設定

「role」は認証を与える単位のようなもので、ユーザー認証の際にはロール単位でアクセス許可を与えます。「rolename」を使ってロール名を定義していきます。

「user」はユーザー認証を行うユーザー名とパスワードを登録していきます。ユーザー名は「username」に、パスワードは「password」に記述します。そしてユーザーが所属するロールを「roles」で指定します。複数のロールに所属する場合はカンマ(,)で区切って記述します。

認証の流れ

認証の流れとしては、ダイアログが表示されユーザー名とパスワードを入力するとまずユーザーの特定が行われます。そしてそのユーザーが所属するロールが許可するロールに含まれているかどうかを判別してアクセスの許可を与えます。(アクセス許可するロールの指定はweb.xmlファイル内の <auth-constraint>要素の中の<role-name>要素で指定します。詳しくは『BASIC認証(web.xmlの編集)』を参照して下さい)。

見て頂くと分かる通り、ユーザーの管理を1つのファイルで行いしかもユーザーの登録や更新などをプログラム側から行うには多少テクニックが必要となります。その為、簡易的に利用するにはいいのですが、人数が多いユーザー管理を行うにはあまり適してはいません。

実際の設定例

では実際に試してみます。

まず「tomcat-users.xml」を編集します。ロールとして「sales」と「staff」を定義します。そして「sales」ロールに所属するユーザーとして「yamada」を、そして「staff」ロールに所属するユーザーとして「katou」を追加します。パスワードはユーザー名と同じにしておきました。

<?xml version='1.0' encoding='utf-8'?>
<tomcat-users>
  <role rolename="tomcat"/>
  <role rolename="role1"/>
  <role rolename="manager"/>
  <role rolename="admin"/>
  <role rolename="sales"/>
  <role rolename="staff"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="role1" password="tomcat" roles="role1"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="admin" password="*******" roles="admin,manager"/>
  <user username="yamada" password="yamada" roles="sales"/>
  <user username="katou" password="katou" roles="staff"/>
</tomcat-users>

次にweb.xmlファイルを次の条件で作成します。

リソース名:User Basic Auth
対象サーブレット:このアプリケーションに含まれる全てのサーブレット
対象のHTTPメソッド:全て
許可するロール名:sales
認証方式:BASIC認証
レルム名:User Basic Auth

作成した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>
    <servlet-class>AuthTest1</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AuthTest1</servlet-name>
    <url-pattern>/AuthTest1</url-pattern>
  </servlet-mapping>

  <servlet>
    <servlet-name>AuthTest2</servlet-name>
    <servlet-class>AuthTest2</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>AuthTest2</servlet-name>
    <url-pattern>/AuthTest2</url-pattern>
  </servlet-mapping>

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>User Basic Auth</web-resource-name>
      <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
      <role-name>sales</role-name>
    </auth-constraint>
  </security-constraint>

  <login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>User Basic Auth</realm-name>
  </login-config>

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

それでは一度サーブレットを再起動してから、ブラウザで「http://localhost:8080/auth/AuthTest1」へアクセスして下さい。

BASIC認証

上記のようにユーザー名とパスワードを入力するダイアログが表示されます。先ほど登録したユーザー名「yamada」パスワード「yamada」を入力します。

BASIC認証

「yamada」はユーザー認証が通り、所属するロールがアクセス許可に設定してるため、ページを見ることができます。

BASIC認証

一度ユーザー認証が通れば同じ認証が設定されている他のページにはユーザー認証無しでアクセスが可能です。「テストページ2へ」をクリックしてみて下さい。

BASIC認証

ではユーザー認証は行えたが所属するロールがアクセス許可されていない場合の挙動を確認しておきます。一度ブラウザを閉じてから再度同じページへアクセスして下さい。ダイアログが表示されますので今度はユーザー名「katou」パスワード「katou」を入力します。

BASIC認証

次のように「HTTPステータス 403 - 要求されたリソースへのアクセスが拒否されました」と言うエラーメッセージが表示されます。

BASIC認証

( Written by Tatsuo Ikura )

プロフィール画像

著者 / TATSUO IKURA

これから IT 関連の知識を学ばれる方を対象に、色々な言語でのプログラミング方法や関連する技術、開発環境構築などに関する解説サイトを運営しています。