OpenSSO でカスタマイズしたユーザー属性を作成して使用する方法
原文:2009年2月25日時点の Creating Custom User Attributes in OpenSSO
このページは、概ね、原文の内容をそのまま訳しつつ、一部、原文の内容が古い(手順例で使用しているビルドが古いなど)場合などは、適宜最新の情報に書き直しているものもあります。逆に、原文が新しく更新されていても、それに完全に追従できていない場合もあります。 |
Sun OpenSSO Enterprise 8.0 の公式のマニュアルは、docs.sun.com の以下のサイトでご覧になれます。 |
目次
はじめに
iPlanetAMUserService を変更する
データソース設定を変更する
LDAP を変更する
動作確認
はじめに
OpenSSO では、下流部門のビジネスアプリケーションで使用可能なカスタマイズしたユーザー属性を作成することができます。
ここでは、属性を作成する対象となる LDAP サーバーとして、OpenSSO にデフォルトで組み込まれている OpenDS をターゲットとしています。
iPlanetAMUserService を変更する
OpenSSO は設定データを LDAP の ou=services に格納します。iPlanetAMUserService サービスには管理コンソールのユーザープロファイルページで何を表示させるかに関する情報が含まれています。このサービスを変更することで、カスタマイズした属性をプロファイルページ上に表示させたり、ページ上でその属性を変更することが可能となります。
- iPlanetAMUserService の設定は amUser.xml というファイルの中にあります。このファイルは、OpenSSO の設定ディレクトリ内にあります。Windows の場合は、デフォルトで C:\Documents and Settings{your name}\opensso\config\xml の下にあります。Unix の場合は、$HOME/opensso/config/xml の下にあります。
- amUser.xml のバックアップをとる。
amUser.xml を変更する前に、念のためバックアップをとっておきます。
# cp amUser.xml amUser.xml.org
- amUser.xml を編集して、<User> 要素内に次のような新しい <AttributeSchema> 要素を追加します。
"name" プロパティーは、LDAP の属性名に相当するもので、LDAP naming standard 準拠してる必要があります。
キャメルケースにしておくとより安全です。(キャメルケースとは、複数の単語を、先頭を大文字にしつつつなげて綴ること)
"i18nKey" プロパティーはユーザープロファイルページに表示されるラベル文字列に相当します。
このラベルに日本語を表示させたい場合は、"i18nKey" プロパティーには、キーを指定して、
関連する日本語リソースファイルで、そのキーに対応する日本語文字列を Unicode 形式で指定します。
以下の例では、"i18nKey" プロパティーには、"key-baseballteam" というキーを指定して、
amUser.xml に対応する日本語リソースファイル amUser_ja.properties 内で、
key-baseballteam キーとそれに対応する値として「所属球団」という文字列を Unicode 変換した値 "\u6240\u5c5e\u7403\u56e3"を指定してます。
<AttributeSchema name="baseballteam" type="single" syntax="string" any="display" i18nKey="key-baseballteam"> </AttributeSchema>
- 編集した amUser.xml を保存する。
- amUser_ja.properties にキーと対応するラベル文字列を追加する。
amUser_ja.properties は、OpenSSO を配備したディレクトリの配下の WEB-INF/classes ディレクトリにあります。
# cd /opt/SUNWappserver/domains/domain2/applications/j2ee-modules/opensso/WEB-INF/classes/
編集する前に、オリジナルの amUser_ja.properties のバックアップをとっておきます。
# cp amUser_ja.properties amUser_ja.properties.org
native2ascii コマンドを用いて、"所属球団" という文字列を Unicode 変換し、amUser_ja.properties の最後に追加します。
#echo "所属球団" | native2ascii \u6240\u5c5e\u7403\u56e3 # # echo "key-baseballteam=\u6240\u5c5e\u7403\u56e3" >> amUser_ja.properties
- OpenSSO の zip ファイルを解凍すると tools ディレクトリの中に famAdminTools.zip があります。
o famAdminTools.zip を unzip コマンドで解凍します。
o setup または setup.bat を実行します。OpenSSO の設定ディレクトリの場所を聞かれるので、OpenSSO を配備した際に指定した設定ディレクトリのパスを入力します。デフォルトでは、Windows の場合は、"C:\Documents and Settings{your name}\opensso"、Unix の場合は、"$HOME/opensso" です。
o setup が完了すると、現在のディレクトリの下に、opensso というディレクトリが生成されます(デフォルトの場合)。例えば、上で設定ディレクトリのパスを /opensso2 と指定した場合は、opensso2 というディレクトリが生成されます。さらに、そのサブディレクトリとして、bin ディレクトリが生成され、その中にコマンドラインツールがあります。
- ssoadm コマンドを使って、iPlanetAMUserService 設定を変更します。まず最初に既存のサービス設定を削除します。
ssoadm コマンドを使用する際には、amadmin のパスワードを格納したパスワードファイルを指定する必要があります。
OpenSSO を配備した際に指定した amadmin のパスワードを次のようにしてファイルに格納します。
# echo "adminadmin" > /export/amadminpass.txt
そして、以下のように、-f オプションを使ってパスワードファイルを指定して、ssoadm delete-svc コマンドを用いて iPlanetAMUserService を削除します。
# ./ssoadm delete-svc -u amadmin -f /export/amadminpass.txt -s iPlanetAMUserService サービスが削除されました。 #
サービスが削除されたことを確認できたら、以下のように --xmlfile オプションを使って変更を加えた amUser.xml を指定し、ssoadm create-svc コマンドを用いて、iPlanetAMUserService を作成します。
# ./ssoadm create-svc -u amadmin -f /export/amadminpass.txt --xmlfile /opensso/config/xml/amUser.xml サービスが追加されました。 #
- サービスが追加されたことを確認したら、OpenSSO が配備されているドメインを再起動します。以下の例では、OpenSSO は、domain2 に配備されています。
# /opt/SUNWappserver/bin/asadmin stop-domain domain2 ; /opt/SUNWappserver/bin/asadmin start-domain domain2
- OpenSSO コンソールに amadmin でログインし、「アクセス制御」タブでレルムを選択し、「対象」タブをクリックして、ユーザーの一覧から適当なユーザーをクリックします。以下のように、さきほど追加した属性「所属球団」がプロファイルページに表示されているはずです。

試しにこのフィールドに値を入れて、保存してみます。そして、再度ユーザーのプロファイルを表示してみると、さきほど入力した値が保存されていません。

ログファイルをチェックすると、保存時に exception エラーが発生してることがわかります。これは、データソース側でさきほど追加した属性を扱えるように変更を加えていないためです。このエラーを解消するために、次に、データソース設定の変更を行います。
データソース設定を変更する
このステップでは、ユーザープロファイル画面から LDAP ユーザーストアへの橋渡しをします。
- OpenSSO 管理コンソールにログインして、「アクセス制御」タブへ移動し、レルムを選択したのち、「データストア」タブをクリックして、データストアのリストから「embedded」をクリックします。
- 「LDAP ユーザーオブジェクトクラス」フィールドで、LDAP 上に新たに作成するオブジェクトクラスの名前として "baseballteam" と入力して、「追加」ボタンをクリックします。

- 「LDAP ユーザー属性」フィールドで、LDAP 上に新たに作成する属性の名前として "baseballteam" と入力して、「追加」ボタンをクリックします。

- 「LDAP バインド DN」とパスワードが設定済みであるか確認します。 値が空白の場合は、適切な DN 値とパスワードを入力します。ここでは、組み込みの OpenDS を使っているので、バインド DN は、"cn=Directory Manager" です。パスワードは OpenSSO を配備した際に指定した値を入れます。

- 「保存」して変更内容を保存します。ここでこのページの各フィールドに追加した値は LDAP ユーザーストアへと渡されます。
LDAP を変更する
この時点で、OpenSSO は新しく追加した属性を LDAP に渡すように設定されています。しかし、LDAP 上にはまだ属性は存在しておらず、またオブジェクトクラスとの結びつけも行われていません。それらに対処するために、次のステップに進みます。
- /tmp/test.ldif を作成する。
先ほど、OpenSSO 上で設定した値に従って、新しい属性 baseballteam とそれに対応するオブジェクトクラス baseballteam を LDAP に追加するするように、LDIF 文を作成します。
LDIF 文を作成するにあたっては、OpenSSO の設定ディレクトリ(例えば /opensso)にある am_remote_opends_schema.ldif を参考にできます。(NAME の前に来るドットで区切られた数字の並びは、他と同じようなパターンにして、最後のドット以降の数字だけ他と異なるようにします。以下の attributeTypes の例でいえば、1.3.6.1.4.1.42.2.27.9.1. までは他と同じで、9990 の部分だけ他と異なります。)
例えば、次のような LDIF 文を作成し、/tmp/test.ldif ファイルに保存します。
ファイルの最後に1行空行を入れるようにしてください。
dn: cn=schema changetype: modify add: attributeTypes attributeTypes: ( 1.3.6.1.4.1.42.2.27.9.1.9990 NAME 'baseballteam' DESC 'Baseball team' SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE X-ORIGIN 'Baseball team' ) - add: objectClasses objectClasses: ( 1.3.6.1.4.1.42.2.27.9.2.9999 NAME 'baseballteam' DESC 'Baseball team' SUP top AUXILIARY MAY ( uid $ baseballteam ) X-ORIGIN 'Baseball team' )
- ldapmodify コマンドを使って、新しく追加した属性タイプとオブジェクトクラス(どちらも baseballteam という名前にしてある) を OpenDS のスキーマに追加します。以下の例では、OpenDS はポート 50389 で実行されているので、-p オプションの後には 50389 を指定しています。
# ldapmodify -D "cn=Directory Manager" -w adminadmin -p 50389 -f /tmp/test.ldif
これで、LDAP 側でも新しく追加した属性を処理できるようになりました。
動作確認
これまでの設定が正しいかどうか確認するために検証を行います。
その前に、LDAP の変更内容を反映させるために OpenDS を再起動します。
OpenDS は OpenSSO に組み込まれているため、再起動するには、OpenSSO を配備してるアプリケーションサーバーのドメインを再起動します。
# /opt/SUNWappserver/bin/asadmin stop-domain domain2 ; /opt/SUNWappserver/bin/asadmin start-domain domain2
- アプリケーションサーバーが起動したら、OpenSSO 管理コンソールにログインし、「対象」タブのユーザーリストからユーザーを適当にクリックします。ここでは、先ほどの例でも使ったユーザー "松坂大輔" を使用します。
新しく追加した「所属球団」属性に「レッドソックス」という値を入力し、「保存」をクリックします。
いったん「対象へ戻る」ボタンをクリックしてユーザーリストに戻ったあと、再度 "松坂大輔" を選択すると

今度は「所属球団」属性の値が正しく保持されています。
値が正しく保存されているかどうか LDAP 側でも確認できます。
検索しやすいように、「所属球団」の値を「Boston Red Sox」に変更して保存して

次のようなコマンドを実行すると、baseballteam というオブジェクトクラスが存在すること、baseballteam という属性の値として、"Boston Red Sox" という値が設定されていることが確認できると思います。
# ldapsearch -D "cn=Directory Manager" -w adminadmin -p 50389 -b dc=opensso,dc=java,dc=net uid=matsuzaka

これで設定結果が正しいことを確認できました。

