[Java]
[Webアプリケーション] [Tomcat]
Tomcatには、ユーザ認証のアカウント管理にいくつかの方法があります。J2EEではレルムという方法で管理できますが、そのなかでTomcatに固有の設定を見てみましょう。
レルムには、ユーザとロール(グループのようなもの)があります。レルムを辞書で引いてみると、領域というような意味があります。
初期設定されているのはメモリーレルム、とその上位互換性のあるUserDatabaseレルムです。UserDatabaseレルムはtomcat-users.xml の更新にも対応した形式で、ファイルは同じものです。
ダイジェスト認証は 古いMemoryRealmのみ対応しているらしい。(5.0.27の場合)
こちらはデータベースを使って管理する方法です。
LDAPなどのJNDIに対応した方式? のようです。DataSourceは、別です。
これは、Tomcatに限らず選べます。BASIC認証やFORM認証などがありますが、Tomcat固有ではないのでここでは省略します。
参考
各方式の設定についてみてみます。MemoryRealmだけが管理画面から設定することができました。
conf/server.xml などに設定します。
<Engine>、<Host>、<Context> などの下に<Realm>を定義できます。より小さなところに書かれたRealmが機能します。
<Realm className="" debug="0" resourceName="" /> こんな感じなので、classNameを変えれば独自のTomcat用レルムが用意できそうです。親となる org.apache.catalina.Realm が用意されています。J2EEで共通というわけではないようです。
(よくあるので省略)。これはTomcatの管理画面からも設定できます。その他の設定はできないようです。
よくわからないが、こんな感じ。メモリーレルムの上位互換?
<Realm className=>
<Resource name="UserDatabase" 〜 />
<ResourceParams name="UserDatabase">
データベースに最低限必要なテーブルは
この2つの関係です。ユーザ名を指定する列名は、双方同じでないといけません。IDなどで関連づけできないですね。
| テーブル | ||
|---|---|---|
| ユーザ | アカウント | パスワード |
| ロール | ロール名 | |
| リレー | アカウント | ロール名 |
ロール名だけのテーブルは必要ありませんが、ロール名を決めておきたければ、こんな感じで作って、ユーザとリレーをレルムに指定してもいいんじゃないでしょうか。
<Realm className="org.apache.catalina.realm.JDBCRealm"
connectionName="DBのアカウント"
connectionPassword="DBのパスワード"
connectionURL="DBのURL"
digest="" ダイジェストパスワードを使う場合に設定する
driverName="DBドライバのクラス名"
roleNameCol="ロール表のロール名の列名"
userCredCol="ユーザ表のパスワード列名"
userNameCol="両方の表のユーザ列名"
userRoleTable="ユーザロール表名"
userTable="ユーザ表名">
<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を参照してくれるでしょうか。
参考