- PR -

Tomcat5のデータソースレルム

1
投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-07-12 17:53
Tomcat5のデータソースレルムに関する質問です。

環境
 Red Hat Linux9
 Tomcat5.0

作成中のオリジナルWebアプリケーションのユーザ認証では、データソースレルムを用いてBasic認証を行います。
現在のデータベースはPostgreSQL7.4で、ユーザIDとパスワードは以下のようなテーブルに格納しています。

コード:
CREATE TABLE users (
  user_id         VARCHAR(30)  NOT NULL
 ,hashed_password VARCHAR(100)
 ,enabled         BOOLEAN      NOT NULL
);



ユーザを一時的に無効化できるように enabled(有効か?) という列を設けて、この値がTRUEのユーザのみが認証されるようにします。そのために、Tomcat5のデータソースレルムからはこのテーブルを直接参照するのではなく、以下のようなビューを参照させています。

コード:
CREATE OR REPLACE VIEW users_v
AS
  SELECT user_id,
         hashed_password
    FROM users
   WHERE enabled = true;



さて、このたびデータベースをMySQL4.0に変更しようと考えています。ただし問題があり、MySQL4.0ではビューが使用できません。

さあ、困った。

org.apache.catalina.realm.DataSourceRealm のソースを見ましたが、server.xmlの設定によって動的に"WHERE enabled = true"のような抽出条件を付加するのは無理そう。

今のところ有効なユーザのみを格納する別テーブルを作り、二重メンテナンスでもしようかと考えていますが、何か他に良いアイディアがあればぜひ聞かせてもらえませんでしょうか。

なお、DataSourceRealmのサブクラスを作ったり、コピー&改造して都合の良いように書き換える案もありますが、将来Tomcatがバージョンアップする度に気にしないといけなくなるのがネックです。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-07-12 18:39
org.apache.catalina.realm.DataSourceRealmのソースを眺めていたら、server.xmlで、

コード:
<Realm
  className="org.apache.catalina.realm.DataSourceRealm"
  dataSourceName="jdbc/xxxx"
  digest="MD5"
  userTable="users"
  userNameCol="enabled = true AND user_id"
  userCredCol="hashed_password"
  userRoleTable="roles"
  roleNameCol="role_name"
/>



とかやればうまくいくことに気づきました。
ただしロールテーブル(上で言うroles)にも、ダミーのenabled列を作らないといけないはず。

想定外の方法であることは100%確実、SQLインジェクションの一種のような気もするけど、セキュリティホールってわけでもないし。
まぁ、いっか!? ・・・いいのか?
1

スキルアップ/キャリアアップ(JOB@IT)