目次へ

12. ユーザ情報の管理

Tomcatではユーザ情報(ユーザ名・パスワード・ロール名)を管理する方法として、10章で使用したファイル以外の方法も提供しています。この章ではそれらについて説明します。ユーザ情報の管理方法と認証部分は完全に独立していますので、管理方法を変更してもWebアプリケーションに変更を加える必要はありません。

12.1. JDBC Realm/DataSource Realm

JDBC RealmおよびDataSource Realmは、データベースでユーザ情報を管理する方法です。

JDBC Realmを使用するには、Tomcatのserver.xmlのMemory Realmの設定に置き換えて、以下のように設定を行います。

<Realm className="org.apache.catalina.realm.JDBCRealm" debug="1"
       driverName="org.postgresql.Driver"
       connectionURL="jdbc:postgresql:Training"
       connectionName="postgres" connectionPassword="postgres"
       userTable="users" userNameCol="name" userCredCol="password"
       userRoleTable="roles" roleNameCol="role"/>

それぞれの属性の意味は、以下の通りです。

属性名 必須 内容
className 必ず「org.apache.catalina.realm.JDBCRealm」を指定します。
debug   デバッグ情報を出力するレベルを指定します。数字が高いほど、デバッグ情報がたくさん出力されます。
driverName JDBCドライバの名前を指定します。
connectionURL 接続するデータベースのURLを指定します。
connectionName データベースに接続する際のユーザ名を指定します。
connectionPassword データベースに接続する際のパスワードを指定します。
userTable ユーザ名とパスワードが格納されたテーブルの名前を指定します。
userNameCol ユーザ名が格納されているテーブルのカラム名を指定します。
userCredCol パスワードが格納されているテーブルのカラム名を指定します。
userRoleTable ユーザ名とロール名が格納されたテーブルの名前を指定します。
roleNameCol ロール名が格納されているテーブルのカラム名を指定します。

userTableおよびuserRoleTableで指定されたテーブルにおいて、ユーザ名が格納されているカラムの名前が同じであるというのが1つの制約です。例えばTomcatの設定が先の通りで、テーブルの中身が以下の通りであるとすると、「hatanaka」ユーザはパスワードが「akihiro」で、「manager」ロールを持つことになります。ユーザ名・パスワード・ロール名を保持した1つのテーブルで情報を管理することも可能です。

usersテーブル
name password
hatanaka akihiro
ehara yoshinori

rolesテーブル
name role
hatanaka manager

DataSource Realmでは「className」に「org.apache.catalina.realm.DataSourceRealm」を指定し、JDBC Realmで行っていた「driverName」および「connectionURL」「connectionName」「connectionPassword」の代わりに「dataSourceName」を指定します。他は同じです。dataSourceNameには、リソースとして登録されている、「javax.sql.DataSource」の名前を指定します。DataSourceおよびそれのTomcatへの登録に関しては、JDBCの「DataSourceからConnectionを取得する」の章を参照してください。

ただし1つ制約があり、DataSource Realmと同じレベルでDataSourceの登録を行っても、DataSource Realmからは見えません。DataSource Realmから見えるようにするには、DataSourceを上位のレベル、サーバレベルに登録する必要があります。サーバレベルで登録を行うためには、Tomcatのserver.xmlの<GlobalNamingResources>内部に設定を行います。<GlobalNamingResources>は<Server>内部に1つ存在します。<GlobalNamingResources>内部の設定は、<Context>内部の場合と同じにしてください。

<GlobalNamingResources>
  <Resource name="global/jdbc/connection" auth="Container"
            type="javax.sql.DataSource" />
  ...
</GlobalNamingResouces>
...
  <Context>
    <Realm className="org.apache.catalina.realm.DataSourceRealm" debug="1"
           dataSourceName="global/jdbc/connection"
           userTable="users" userNameCol="name" userCredCol="password"
           userRoleTable="roles" roleNameCol="role" />

(実習課題1)

前々章・実習課題4のWebアプリケーションを、JDBC Realmを使用するように改良しなさい。

解答例はこちら

(実習課題2)

実習課題1のWebアプリケーションを、DataSource Realmを使用するように改良しなさい。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp