- 12.1. JDBC Realm/DataSource Realm
- 12.2. OpenLDAP
- 12.3. JNDI Realm
- 12.4. パスワードの暗号化
12.3. JNDI Realm
JNDI RealmはJNDI APIを用いてディレクトリサービスにアクセスし、その情報をユーザ情報として認証を行うRealmです。JNDI Realmを用いるためには、server.xmlの<Realm>タグに以下の属性を指定します。
属性名 | 必須 | 内容 |
---|---|---|
className | ○ | 必ず「org.apache.catalina.realm.JNDIRealm」を指定します。 |
connectionURL | ○ | アクセスするディレクトリサービスのURLを指定します。「ldap://(ホスト名):(ポート番号)」の形で指定します。例えば「ldap://localhost:389」となります。 |
debug | デバッグ情報を出力するレベルを指定します。数字が高いほど、デバッグ情報がたくさん出力されます。 |
この他にユーザ名とパスワード、およびロール名を検索するための条件をそれぞれ指定します。まずユーザ名とパスワードに関連するものを説明します。ユーザ名に関しては、「userPattern」か「userBase」「userSearch」「userSubtree」のいずれかを指定します。前者はDNにユーザ名が含まれる場合、後者はオブジェクトのプロパティにユーザ名が含まれる場合に指定します。いずれの場合でも、パスワードはオブジェクトのプロパティに含まれます。
属性名 | 必須 | 内容 |
---|---|---|
userPattern |
DNにユーザ名が含まれる場合に指定します。java.text.MessageFormatのフォーマットで指定し、ユーザ名が現れる部分を{0}で指定します。例えば「com.techscore.developing.{0}」と指定し、hatanakaユーザがログインを試みたとすると「com.techscore.developing.hatanakla」にあるオブジェクトが検索されます。 |
|
userBase | オブジェクトを検索する基準となるDNを指定します。userPatternで使用できるフォーマットでは指定できません。 | |
userSearch | オブジェクトの検索条件を指定します。ldapsearchコマンドの検索条件と同じフォーマットで、ユーザ名が現れる部分を{0}で指定します。例えば「(ou={0})」と指定すると、ouの値がユーザ名であるオブジェクトが検索されます。 | |
userSubtree | userBaseで指定したDN以下のサブツリーを全て検索する場合に「true」を指定します。「false」を指定すると、userBaseで指定したDNの子オブジェクトしか検索されません。デフォルトは「false」です。 | |
userPassword | パスワードが含まれるオブジェクトのプロパティを指定します。省略した場合には、ユーザ名に対応したオブジェクトが見つかった時点で、認証に成功したものとみなします。 |
ロール名に関しては、「userRoleName」か「roleBase」「roleSearch」「roleSubtree」「roleName」のいずれかを指定します。前者はユーザ名で検索されたオブジェクトがロール名をプロパティとして持っている場合に指定し、後者は別のオブジェクトがロール名をプロパティとして持っている場合に指定します。両者のいずれかが必ず指定されなければなりません。
属性名 | 必須 | 内容 |
---|---|---|
userRoleName |
ロール名が含まれるオブジェクトのプロパティを指定します。 |
|
roleBase | オブジェクトを検索する基準となるDNを指定します。 | |
roleSearch |
オブジェクトの検索条件を指定します。ldapsearchコマンドの検索条件と同じフォーマットで、ユーザ名が含まれるオブジェクトのDNを{0}、ユーザ名を{1}で指定します。例えば「(member={0})」と指定すると、memberの値がユーザ名が含まれるオブジェクトのDNと同じオブジェクトが検索されます。{0}と{1}は片方だけでも、両方指定しても構いません。 |
|
roleSubtree | roleBaseで指定したDN以下のサブツリーを全て検索する場合に「true」を指定します。「false」を指定すると、roleBaseで指定したDNの子オブジェクトしか検索されません。デフォルトは「false」です。 | |
roleName | ロール名が含まれるオブジェクトのプロパティを指定します。 |
例えばOpenLDAPに以下のオブジェクトが登録されているとします。トップレベルおよび中間レベルのオブジェクトの登録は省略しています。
# hatanaka user dn: uid=hatanaka,ou=developing,dc=techscore,dc=com objectclass: inetOrgPerson uid: hatanaka sn: hatanaka cn: Hatanaka, Akihiro userPassword: akihiro #ehara user dn: uid=ehara,ou=developing,dc=techscore,dc=com objectclass: inetOrgPerson uid: ehara sn: ehara cn: Ehara, Yoshinori userPassword: yoshinori # manager group dn: cn=manager,ou=developing,dc=techscore,dc=com
objectclass: groupOfNames
cn: manager
member: uid=hatanaka,ou=developing,dc=techscore,dc=com member: uid=ehara,ou=developing,dc=techscore,dc=com
JNDIRealmの設定が以下の通りで、ユーザ名「hatanaka」でログインを試みると、パスワードは「akihiro」で、認証に成功した場合、ロールとして「manager」を持ちます。
userBase | ou=developing,dc=techscore,dc=com |
userSearch | (sn={0}) |
userPassword | userPassword |
roleBase | ou=developing,dc=techscore,dc=com |
roleSearch | (member={0}) |
roleName | cn |
userBaseとuserSearchを
userPattern | uid={0},ou=developing,dc=techscore,dc=com |
に変えても、実質的に同じとなります。
(実習課題4)
実習課題2のWebアプリケーションを、JNDI Realmを使用するように改良しなさい。OpenLDAPに登録したオブジェクトも明らかにすること。