12. ユーザ情報の管理
- 12.1. JDBC Realm/DataSource Realm
- 12.2. OpenLDAP
- 12.3. JNDI Realm
- 12.4. パスワードの暗号化
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を使用するように改良しなさい。