目次へ

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
注:roleSearchについて、Jakartaのページでは()をつける様に書いてありますが、つけると動作せず、はずすと動作しました。[WinXP、IE6、Tomcat4.1.30、JSDK1.4.2_04]

userBaseとuserSearchを

userPattern uid={0},ou=developing,dc=techscore,dc=com

に変えても、実質的に同じとなります。

(実習課題4)

実習課題2のWebアプリケーションを、JNDI Realmを使用するように改良しなさい。OpenLDAPに登録したオブジェクトも明らかにすること。

解答例はこちら

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp
  • シナジーマーケティング研究開発グループブログ