MASUDAQ Blog

NO DEVELOPMENT NO LIFE.

Apache Tomcat 6.0 のフォーム認証 -DataSourceRealm-

前回に続き、今回は、Apache Tomcat 6.0 のレルム "DataSourceRealm" について紹介する。

DataSourceRealm は、ユーザー、パスワードを RDB に保持し、その RDB へは、JNDI 経由の JDBC でアクセスする。Java プラットフォームで Web アプリケーションを開発する際に、もっとも、一般的な方法だろう。

まず、ユーザー情報、ロール情報を管理するテーブルを作成する。筆者の開発環境は、MySQL Server 5.1 を利用しているが、JDBC ドライバーが提供されている RDB であれば、何を使ってもよい。

create table users (
  user_name varchar(15) not null primary key,
  user_pass varchar(15) not null
);

create table user_roles (
  user_name varchar(15) not null,
  role_name varchar(15) not null,
  primary key (user_name, role_name)
);

server.xml にレルムの宣言を記載する。

<Realm className="org.apache.catalina.realm.DataSourceRealm" debug="99"
dataSourceName="jdbc/authority"
userTable="users" userNameCol="user_name" userCredCol="user_pass"
uuserRoleTable="user_roles" roleNameCol="role_name"/>

dataSourceName 属性には、DB のパスを設定する。例では、"authority" DB へアクセスする。この場合、JNDI のデータソースは、"java:/comp/env/jdbc/authority" というパスで参照される。userTable は、ユーザー情報が格納されているテーブル名、userNameCol は、ユーザー名を格納するカラム名、userCredCol は、ユーザーパスワードを格納するカラム名。userRoleTable は、ロール情報を格納するテーブル名。roleNameCol  は、ロール名を格納するカラム名。debug 属性は任意。

同じく server.xml に、レルム宣言に対応するリソースである JDBC ドライバーのリソースを定義する。レルムで使用するリソースは、GlobalNamingResources ノード下に定義する。また、Realm.dataSourceName と、Resource.name が対応していることに注意する。driverClassName: 筆者の開発環境は、MySQL を利用している。

<Resource name="jdbc/authority" driverClassName="com.mysql.jdbc.Driver" type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/authority" username="root" password="password" auth="Container" maxActive="100" maxIdle="30" maxWait="10000" />

重複になるが、Resource ノードをカレントのプロジェクトの Context ノード下に定義しても動作しないことに注意する。また、筆者の環境だけなのか、server.xml において、レルムの設定を変更しても環境に設定が反映されなかった。Eclipse を再起動すると設定が反映された。筆者の理解不足なのだろうが、他者も同様の問題で悩んでいることもあり得るので、あえて、ここに記載しておく。

以降の手順は、前回と同様で良い。"web.xml" の "security-constraint/auth-constraint/role-name" には、"server.xml" の "Realm" ノードに定義した "userRoleTable" テーブルの "roleNameCol " 値の任意のロール名をハードコードする。

 

このエントリーをはてなブックマークに追加