BASIC認証(JDBCRealmレルム)

広告

前回はユーザー管理をファイルで行っていましたが、今度はデータベースを用いてユーザー管理を行ってみます。データベースを使う場合には「JDBCRealmレルム」を使います。

まず「server.xml」ファイルを編集します。元々有効になっている「UserDatabaseRealm」に関する部分をコメントにし、JDBCRealm用として記述されている中のMySQLを使うものをコメントを外して有効にします。

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

<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" />

それでは「JDBCRealm」レルムの使い方を詳しく見ていきます。

JDBCRealmレルム

「JDBCRealm」レルムはユーザー情報をデータベースで管理する方法で現実的にはこの方法がいいのではと思います。

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

属性内容
classNameJavaクラス名を指定します。「org.apache.catalina.realm.JDBCRealm」を指定します。
driverName使用するJDBCドライバのJavaクラス名を指定します。MySQLの場合は「com.mysql.jdbc.Driver」を指定します。
connectionURLデータベースのURLを指定します。
connectionNameデータベース接続用のユーザー名を指定します。
connectionPasswordデータベース接続用のパスワードを指定します。
userTableユーザー名とパスワードが含まれるテーブル名を指定します。
userNameColユーザー名が含まれるカラム名を指定します。
userCredColパスワードが含まれるカラム名を指定します。
userRoleTableロール名とユーザー名が含まれるテーブル名を指定します。
roleNameColロール名が含まれるカラム名を指定します。
digestダイジェストアルゴリズム。SHA、MD2、MD5を指定する。省略可能でデフォルトはcleartext。

「className」以外はデータベースに関する設定となります。

利用するデータベースの設定

「driverName」には使用するJDBCドライバを指定します。デフォルトで「org.gjt.mm.mysql.Driver」が記述されていますが、新しいドライバーは「com.mysql.jdbc.Driver」ですので変更して下さい。

「connectionURL」には、サーブレットで「getConnection」メソッドを使う場合のURLと同じ形式で記述します。(詳しくは『データベースへの接続と切断』を参照して下さい)。

MySQLの場合次のような書式となります。

jdbc:mysql://(サーバ名)/(データベース名)

ローカルホストにある「auth」データベースを使う場合には次のようになります。

jdbc:mysql://localhost/auth

データベース内には2つのテーブルを用意します。ユーザー名とパスワードが含まれるユーザーテーブル、そしてユーザー名とロール名が含まれるロールテーブルです。それぞれデータ型は「varchar型」でいいと思います。文字数は適当に設定して下さい。

例として次のようにMySQLでデータベースとテーブルを作成しました。

BASIC認証

またデータベースへのアクセスのためにユーザーを作成しました。

BASIC認証

以上のデータベースを使う場合、次のようになります。

<Realm  className="org.apache.catalina.realm.JDBCRealm"
       driverName="com.mysql.jdbc.Driver"
    connectionURL="jdbc:mysql://localhost/auth"
   connectionName="authtest" connectionPassword="authtest"
        userTable="user_table" userNameCol="user" userCredCol="pass"
    userRoleTable="role_table" roleNameCol="role" />

ユーザーに複数のロールを設定する場合

「tomcat-users.xml」ファイルを使った場合には、ロールの指定にカンマ(,)で区切って複数のロールを記述していましたが、データベースの場合は1つのレコードにつき1つのロールしか設定できません。

その為、1人のユーザーに複数のロールを設定する場合は、ロールテーブルで複数のレコードを記述して下さい。

実際の設定例

では実際に試してみます。server.xmlのレルムの設定は先ほどのように変更しておいて下さい。

まずMySQLにユーザーを登録しておきます。今回は「itou」と「ueda」の二人のユーザーを追加しました。パスワードはユーザー名と同じです。そして「sales」ロールに所属するユーザーとして「itou」を、そして「staff」ロールに所属するユーザーとして「ueda」を追加します。

BASIC認証

次に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認証

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

BASIC認証

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

BASIC認証

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)