[Java] [Webアプリケーション] [Tomcat]

Tomcatで認証とRealm設定

Tomcatには、ユーザ認証のアカウント管理にいくつかの方法があります。J2EEではレルムという方法で管理できますが、そのなかでTomcatに固有の設定を見てみましょう。

レルムには、ユーザとロール(グループのようなもの)があります。レルムを辞書で引いてみると、領域というような意味があります。

Tomcatの管理方式

メモリーレルム(MemoryRealm)とUserDatabaseレルム

初期設定されているのはメモリーレルム、とその上位互換性のあるUserDatabaseレルムです。UserDatabaseレルムはtomcat-users.xml の更新にも対応した形式で、ファイルは同じものです。

ダイジェスト認証は 古いMemoryRealmのみ対応しているらしい。(5.0.27の場合)

JDBCレルムとDataSourceレルム

こちらはデータベースを使って管理する方法です。

JNDIレルム

LDAPなどのJNDIに対応した方式? のようです。DataSourceは、別です。

認証方式

これは、Tomcatに限らず選べます。BASIC認証やFORM認証などがありますが、Tomcat固有ではないのでここでは省略します。

参考

設定 (configuration)

各方式の設定についてみてみます。MemoryRealmだけが管理画面から設定することができました。

conf/server.xml などに設定します。

<Engine>、<Host>、<Context> などの下に<Realm>を定義できます。より小さなところに書かれたRealmが機能します。

<Realm className="" debug="0" resourceName="" /> こんな感じなので、classNameを変えれば独自のTomcat用レルムが用意できそうです。親となる org.apache.catalina.Realm が用意されています。J2EEで共通というわけではないようです。

メモリーレルム

(よくあるので省略)。これはTomcatの管理画面からも設定できます。その他の設定はできないようです。

UserDatabaseレルム

よくわからないが、こんな感じ。メモリーレルムの上位互換?

<Realm className=>

<Resource name="UserDatabase" 〜 />

<ResourceParams name="UserDatabase">

JDBCレルム、DataSourceレルム

データベースに最低限必要なテーブルは

この2つの関係です。ユーザ名を指定する列名は、双方同じでないといけません。IDなどで関連づけできないですね。

テーブル    
ユーザ アカウント パスワード
ロール ロール名  
リレー アカウント ロール名

ロール名だけのテーブルは必要ありませんが、ロール名を決めておきたければ、こんな感じで作って、ユーザとリレーをレルムに指定してもいいんじゃないでしょうか。

JDBCレルムの場合

<Realm className="org.apache.catalina.realm.JDBCRealm"
connectionName="DBのアカウント"
connectionPassword="DBのパスワード"
connectionURL="DBのURL"
digest="" ダイジェストパスワードを使う場合に設定する
driverName="DBドライバのクラス名"
roleNameCol="ロール表のロール名の列名"
userCredCol="ユーザ表のパスワード列名"
userNameCol="両方の表のユーザ列名"
userRoleTable="ユーザロール表名"
userTable="ユーザ表名">

DataSourceレルムの場合

<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="データソース名 java;comp/env/jdbc/auth のようなの"
digest="" つかわなくてもいい
releNameCol="ロール表のロール名列の名前"
userCredCol="パスワードの列名"
userNameCol="両方の表のユーザ名の列名"
userRoleTable="ロールテーブル名"
userTable="ユーザテーブル名">

バグっぽいもの

Tomcat 5.0.29のAdministration Toolでは、DatsDourceRealmを追加するときに digestに何も指定していなくても、digest=""が追加されてしまいます。そのまま保存すると再読み込みできない状態になるので、動かなくなったときはdigest=""の部分を該当するファイルから削除しましょう。

DataSourceRealm と JdbcDataSource を同じコンテキストの設定ファイルに書き出すと、DataSourceRealmが先、JdbcDataSourceが後になってしまうためか、DataSourceRealmは上位のJdbcDataSourceを参照してしまいます。順番を変えることで同じファイル内のDataSourceを参照してくれるでしょうか。

参考