Sun Java ロゴ     前へ      目次      次へ     

Sun ロゴ
Sun Java™ System Identity Manager 7.0 配備ツール 

第 8 章
Identity Manager Web サービスでの SPML 2.0 の使用

この章では、Identity Manager 7.0 でサポートされる SPML 2.0 について説明しています。これには、サポートされる機能とその理由、SPML 2.0 サポートの設定方法、フィールドでのサポートの拡張方法が含まれます。


この章では、SPML 2.0 のみを扱います。特に明記されていないかぎり、この章での SPML への参照はすべてバージョン 2.0 を示しています。

SPML の使用方法について、役立つ情報が含まれている、第 7 章「Identity Manager Web サービスでの SPML 1.0 の使用」も読まれることをお勧めします。


この情報は、次のように構成されています。


この章の対象読者

アプリケーション開発者および Identity Manager の統合を担当する開発者は、この章で説明されている SPML クラスを使用して、サービスプロビジョニング要求メッセージをフォーマットしたり、応答メッセージを解析したりすることができます。


概要

Identity Manager の Web サービスは SOAP ベースのプログラムインタフェースであり、Identity Manager はこのインタフェースを介して、特定のオペレーティングシステムやプログラミング言語に制限されることなく、ほかの Web ベースアプリケーションと通信できます。

Web サービスインタフェースは Web サーバー上でホストされ、その機能は、次のオープンな標準規格を通してインターネットプロトコルフレームワーク上で公開されます。

Identity Manager の Web サービスには、SOAP メッセージを使用して HTTP 接続経由でアクセスできます。

SPML 2.0 と SPML 1.0 の比較

Identity Manager の Web サービスは、プロビジョニングシステムとの通信のために、XML を使用したサービスプロビジョニングのためのオープンな標準規格である SPML バージョン 1.0 およびバージョン 2.0 の両方のプロトコルをサポートします。


Identity Manager での SPML バージョン 1.0 の使用方法の詳細は、第 7 章「Identity Manager Web サービスでの SPML 1.0 の使用」を参照してください。


SPML 2.0 は SPML 1.0 と比較して、次を含む、多くの点が改善されています。

SPML 2.0 の概念の Identity Manager へのマッピング

SPML 2.0 では、プロビジョニングシステムによって管理されるオブジェクトの説明で、PSO や psoID などの定義用語をはじめとした、独自の用語が使用されています。この節では、これらの概念が Identity Manager にどのようにマップされるかについて説明します。

ターゲット

ターゲットは、サーバー内の論理終端です。各ターゲットには名前が付けられ、そのターゲットが管理するオブジェクト (次の「PSO」を参照) のスキーマを宣言します。ターゲットはサポートされる機能 (要求のセット) も宣言します。

現時点で、Identity Manager では 1 つのターゲットのみがサポートされており、複数のターゲットを宣言することはできません。このターゲットには任意の名前を付けることができますが、データオブジェクトの形式は DSML プロファイルに適合している必要があります。

サポートされるターゲットは、spml2.xml ファイル (Configuration:SPML2 オブジェクト) で定義されているターゲットです。たとえば、コード例 8-6 で、ListTargetResponse は 1 つのターゲット spml2-DSML-Target を返します。

PSO

前の項で説明したように、ターゲットは PSO を管理します。PSO (プロビジョニングサービスオブジェクト) は Identity Manager のビューに似ていますが、動作を持っていません。つまり、PSO は Identity Manager のビュー (特にユーザービュー) のデータ部分として考えることができます。


このリリースの時点で、Identity Manager はユーザーのみを管理し、objectclass という UserExtendedAttribute の定義を要求します。


Identity Manager の目的として、PSO は、フォームを介してユーザービューとの間でマップされる属性のコレクションになります。各オブジェクトは objectclass 属性を指定します。この属性は、ターゲットに対して定義されるスキーマ内の objectclass 定義に、オブジェクトをマップするために使用されます。この属性はその後、repoType の検索や、Identity Manager のビューとの間で属性をマップするフォームの検索に使用されます。

PSOIdentifier

SPML には、PsoID と呼ばれるオブジェクト ID が存在します。

仕様では PSOIdentifier (PsoID) を要求元 (クライアント) からは隠すことが推奨されているため、PSO をシステムに追加するとき、Identity Manager はそのリポジトリ ID (repoID) を PsoID として使用します。

repoID は識別用の ID であり、ユーザーに対する提示は想定されていません。要求元がユーザーに PSO を表示するとき、要求元はオブジェクトの ID を提示する目的で、同等の waveset.accountid (または、Identity テンプレート内で属性が使用されているもの) を使用するようにします。

(ModifyRequest などで) PSO を識別するとき、要求元は waveset.accountId ではなく repoID を使用するようにします。要求元は waveset.accountId を PSOIdentifier として使用することもできますが、推奨されていません。この属性は将来のリリースで変更される可能性があります。要求元は PsoID の不透明性を、できるかぎり維持することが推奨されます。

PSO では、objectclass 属性を使用してオブジェクトタイプを指定します。Identity Manager では、この属性は UserExtendedAttribute である必要があります。Identity Manager では、要求が行われたときに、この属性が存在しない場合に使用するための「デフォルト」を指定できます。SPML 2.0 を有効にする以前から存在していたユーザーについては、objectclass 属性を見つけられない可能性があります。

オープンコンテンツとオペレーショナル属性

SPML の .xsd ファイルでは、仕様の中でオープンコンテンツとして定義されている要素を識別するために、xsd:any が頻繁に使用されています。SPML でのオープンコンテンツとは、ほとんどの要素が任意のタイプの要素を含むことができるという意味です。Identity Manager ではこの概念を利用して、処理を制御する OperationalNVPs (NameValuePairs) および OperationalAttributes を提供しています。OperationalNVPs は XML 内の要素として出現する一方で、オペレーショナル属性は属性として出現します。詳細は、OpenSPML 2.0 Toolkit (http://www.openspml.org) を参照してください。

OperationalNVPs およびオペレーショナル属性については、「サポートされる SPML 2.0 の機能」の節で詳しく説明します。ただし、ListTargets を除くすべての要求およびすべての応答で、使用する NVP は 1 つです。Identity Manager は、session という OperationalNVP に sessionToken を格納します。これにより、システムはユーザーの代わりに自動的にセッションをキャッシュして、処理効率を改善できます。

サポートされる SPML 2.0 の機能

Identity Manager 7.0 では DSML プロファイルを使用して、SPML 2.0 仕様のすべてのコア機能をサポートします。Identity Manager は、Batch や Async などの一部のオプション標準機能もサポートし、Bulk などの一部の標準機能については部分的にサポートします。

この節では、Identity Manager 7.0 でサポートされている SPML 2.0 の機能、Identity Manager で意図的に加えられた仕様およびプロファイル文書との相違点、および、Identity Manager で必須のオペレーショナル属性について説明します。

サポートされるコア機能

Identity Manager は、次のコア機能をサポートしています。

表 8-2 コア機能 

機能

説明

オペレーショナル属性

相違点

AddRequest

指定された PSO をシステムに追加します。

なし

Identity Manager は正式には 1 つのターゲットのみをサポートします。

DeleteRequest

指定された PSO をシステムから削除します。

なし

Identity Manager は正式には 1 つのターゲットのみをサポートします。

ListTargetsRequest

Identity Manager を通して利用可能なターゲットをリストします。

  • username: ユーザーの名前を指定します。
  • password: セッションを確立するために使用するパスワードを指定します。
  • Identity Manager は正式には 1 つのターゲットをサポートします。
  • Identity Manager では、対話での最初の呼び出しに listTargets を使用する必要はありません。ただし、この要求に対する operationalAttributes で、サーバーとのセッションを確立するためのユーザー名とパスワードの組を指定することは可能です (Waveset.properties も使用できる)。

    一般に、ログインしてセッショントークンを使用するほうが、より効率的です。Identity Manager では、この目的のための SessionAwareSpml2Client というクラスが提供されています。

LookupRequest

名前付き PSO の属性を検索して返します。

なし

なし

ModifyRequest

指定された PSO 属性を変更します。

なし

メインの SPML 2.0 仕様と DSML Profile 仕様の間の相違が原因で、Identity Manager は select (および component など) をサポートしません。その代わりに、Identity Manager は DSML Profile に従って、DSML の変更モードおよび要素を使用します。


一般的な相違点には、次のものがあります。

  • Identity Manager は DSML Profile のみをサポートします。
  • Identity Manager では、対話での最初の呼び出しが listTargets である必要はありません。ただし、この要求に対する operationalAttributes を使用して、サーバーとのセッションを確立するための username/password の組を指定することが可能です (Waveset.properties も使用できる)。

AddRequest および ListTargetRequest の例を次に示します。

AddRequest の例

ここでは、AddRequest の例をいくつか示します。

コード例 8-1 は、Identity Manager の SessionAwareSpml2Client クラスを通して ListTargetsRequest を呼び出す .jsp です。

コード例 8-1 クライアントコードの例 

<%@page contentType="text/html"%>

<%@page import="org.openspml.v2.client.*,

                com.sun.idm.rpc.spml2.SessionAwareSpml2Client"%>

<%@page import="org.openspml.v2.profiles.dsml.*"%>

<%@page import="org.openspml.v2.profiles.*"%>

<%@page import="org.openspml.v2.util.xml.*"%>

<%@page import="org.openspml.v2.msg.*"%>

<%@page import="org.openspml.v2.msg.spml.*"%>

<%@page import="org.openspml.v2.util.*"%>

<%

final String url = "http://localhost:8080/idm/servlet/openspml2";

%>

<html>

<head><title>SPML2 Test</title></head>

<body>

<%

// クライアントが必要。

SessionAwareSpml2Client client = new SessionAwareSpml2Client( url );

// ログイン

client.login("configurator", "password");

// AddRequest

String rid = "rid-spmlv2"; // RequestId は厳密には必須ではない。

Extensible data = new Extensible();

data.addOpenContentElement(new DSMLAttr("accountId", user));

data.addOpenContentElement(new DSMLAttr("objectclass", "spml2Person"));

data.addOpenContentElement(new DSMLAttr("credentials", password));

AddRequest add = new AddRequest(rid, // String requestId,

                ExecutionMode.SYNCHRONOUS, // ExecutionMode executionMode,

                null, // PSOIdentifier type,

                null, // PSOIdentifier containerID,

                data, // Extensible data,

                null, // CapabilityData[] capabilityData,

                null,  // String targetId,

                null  // ReturnData returnData

            );

    // 要求を送信する

    Response res = client.send( add );

%>

<%= res.toString()%>

</body>

</html>

コード例 8-2 は、送信される SOAP メッセージの本体を示します。

コード例 8-2 要求 XML の例 

<addRequest xmlns='urn:oasis:names:tc:SPML:2:0' requestID='rid-spmlv2'     executionMode='synchronous'>

  <openspml:operationalNameValuePair xmlns:openspml='urn:org:openspml:v2:util:xml'      name='session' value='AAALPgAAYD0A...'/>

  <data>

    <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='accountId'>

      <dsml:value>exampleSpml2Person</dsml:value>

    </dsml:attr>

    <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='objectclass'>

      <dsml:value>spml2Person</dsml:value>

    </dsml:attr>

    <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='credentials'>

      <dsml:value>pwdpwd</dsml:value>

    </dsml:attr>

  </data>

</addRequest>

コード例 8-3 は、クライアントに返される SOAP メッセージの本体を示します。

コード例 8-3 応答 XML の例 

<addResponse xmlns='urn:oasis:names:tc:SPML:2:0' status='success' requestID='rid-spmlv2'>

  <openspml:operationalNameValuePair xmlns:openspml='urn:org:openspml:v2:util:xml'       name='session' value='AAALPgAAYD0A...'/>

  <pso>

    <psoID ID='anSpml2Person'/>

    <data>

      <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='accountId'>

        <dsml:value>anSpml2Person</dsml:value>

      </dsml:attr>

      <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='objectclass'>

        <dsml:value>spml2Person</dsml:value>

      </dsml:attr>

      <dsml:attr xmlns:dsml='urn:oasis:names:tc:DSML:2:0:core' name='credentials'>

        <dsml:value>pwdpwd</dsml:value>

      </dsml:attr>

    </data>

  </pso>

</addResponse>

ListTargetsRequest の例

次の例は、Identity Manager を介して利用可能な ListsTargetRequest を示します。

コード例 8-4 は、Identity Manager の SessionAwareSpml2Client クラスを通して ListTargetsRequest を呼び出す .jsp を示します。

コード例 8-4 クライアントコードの例 

<%@page contentType="text/html"%>

<%@page import="org.openspml.v2.client.*,

                com.sun.idm.rpc.spml2.SessionAwareSpml2Client"%>

<%@page import="org.openspml.v2.profiles.dsml.*"%>

<%@page import="org.openspml.v2.profiles.*"%>

<%@page import="org.openspml.v2.util.xml.*"%>

<%@page import="org.openspml.v2.msg.*"%>

<%@page import="org.openspml.v2.msg.spml.*"%>

<%@page import="org.openspml.v2.util.*"%>

<%

final String url = "http://localhost:8080/idm/servlet/openspml2";

%>

<html>

<head><title>SPML2 Test</title></head>

<body>

<%

// クライアントが必要。

SessionAwareSpml2Client client = new SessionAwareSpml2Client( url );

// ログイン (ListTargetsRequest を送信する)

Response res = client.login("configurator", "password");

%>

<%= res.toString()%>

</body>

</html>

コード例 8-5 は、送信される SOAP メッセージの本体を示します。

コード例 8-5 要求 XML の例 

<listTargetsRequest xmlns='urn:oasis:names:tc:SPML:2:0' requestID='rid[7013]'     executionMode='synchronous'>

  <openspml:operationalNameValuePair xmlns:openspml='urn:org:openspml:v2:util:xml'     name='accountId' value='configurator'/>

  <openspml:operationalNameValuePair xmlns:openspml='urn:org:openspml:v2:util:xml'     name='password' value='password'/>

</listTargetsRequest>

コード例 8-6 は、クライアントが受信する (クライアントに返される) SOAP メッセージの本体を示します。

コード例 8-6 応答 XML の例 

<listTargetsResponse xmlns='urn:oasis:names:tc:SPML:2:0' status='success' requestID='rid[6843]'>

  <openspml:operationalNameValuePair xmlns:openspml='urn:org:openspml:v2:util:xml'
     name='session' value='AAALPgAAYD0A...'/>

  <target targetID='spml2-DSML-Target' profile='urn:oasis:names:tc:SPML:2:0:DSML'>

    <schema>

      <spmldsml:schema xmlns:spmldsml='urn:oasis:names:tc:SPML:2:0:DSML'>

        <spmldsml:objectClassDefinition name='spml2Person'>

          <spmldsml:memberAttributes>

            <spmldsml:attributeDefinitionReference required='true' name='objectclass'/>

            <spmldsml:attributeDefinitionReference required='true' name='accountId'/>

            <spmldsml:attributeDefinitionReference required='true' name='credentials'/>

            <spmldsml:attributeDefinitionReference name='firstname'/>

            <spmldsml:attributeDefinitionReference name='lastname'/>

            <spmldsml:attributeDefinitionReference name='emailAddress'/>

          </spmldsml:memberAttributes>

        </spmldsml:objectClassDefinition>

        <spmldsml:attributeDefinition name='objectclass'/>

        <spmldsml:attributeDefinition description='Account Id' name='accountId'/>

        <spmldsml:attributeDefinition description='Credentials, e.g. password'
            name='credentials'/>

        <spmldsml:attributeDefinition description='First Name' name='firstname'/>

        <spmldsml:attributeDefinition description='Last Name' name='lastname'/>

        <spmldsml:attributeDefinition description='Email Address' name='emailAddress'/>

      </spmldsml:schema>

      <supportedSchemaEntity entityName='spml2Person'/>

    </schema>

    <capabilities>

      <capability namespaceURI='urn:oasis:names:tc:SPML:2:0:async'/>

      <capability namespaceURI='urn:oasis:names:tc:SPML:2:0:batch'/>

      <capability namespaceURI='urn:oasis:names:tc:SPML:2:0:bulk'/>

      <capability namespaceURI='urn:oasis:names:tc:SPML:2:0:pass'/>

      <capability namespaceURI='urn:oasis:names:tc:SPML:2:0:suspend'/>

    </capabilities>

  </target>

</listTargetsResponse>

Async 機能のサポート

Identity Manager は、表 8-3 で説明した Async 機能をサポートします。

表 8-3 Async 機能

機能

説明

オペレーショナル属性

相違点

CancelRequest

要求 ID を使用して要求をキャンセルします。

なし

 

StatusRequest

要求 ID を使用して要求のステータスを返します。

なし

 

Batch 機能のサポート

Identity Manager は、表 8-4 で説明した Batch 機能をサポートします。

表 8-4 Batch 機能

機能

説明

オペレーショナル属性

相違点

BatchRequest

要求のバッチを実行します。

なし

 

Bulk 機能のサポート

Identity Manager は、表 8-5 で説明した Bulk 機能をサポートします。

表 8-5 Bulk 機能

機能

説明

オペレーショナル属性

相違点

BulkDeleteRequest

PSO の一括削除を実行します。

なし

 

BulkModifyRequest

一致する PSO の一括変更を実行します。

なし

 

Password 機能のサポート

Identity Manager は、表 8-6 で説明した Password 機能をサポートします。

表 8-6 Password 機能 

機能

説明

オペレーショナル属性

相違点

ExpirePasswordRequest

パスワードを失効させます。

なし

  • リソースやターゲットは指定できません。指定すると、Identity Manager の User オブジェクトのパスワードが失効します。これが原因でその後、全ユーザーのリソースのパスワードが失効します。
  • Identity Manager は remainingLogins 属性をサポートしません。

    この属性をデフォルト以外の値に設定すると、OperationNotSupported エラーが発生します。

ResetPasswordRequest

すべてのアカウントに対してパスワードをリセットし、新しい値を返します。

なし

パスワードは漏洩を防ぐ必要があります。SSL またはその他のセキュリティー保護された伝送手段を使用してください。

SetPasswordRequest

パスワードを設定します。

なし

パスワードは漏洩を防ぐ必要があります。SSL またはその他のセキュリティー保護された伝送手段を使用してください。

ValidatePasswordRequest

指定されたパスワードが有効かどうかを判断します。

なし

パスワードは漏洩を防ぐ必要があります。SSL またはその他のセキュリティー保護された伝送手段を使用してください。

Password 機能の例を次に示します。

ResetPasswordRequest の例

コード例 8-7 は ResetPasswordRequest の例です。

コード例 8-7 ResetPasswordRequest の例

              ResetPasswordRequest rpr = new ResetPasswordRequest();

              ...

              PSOIdentifier psoId = new PSOIdentifier(accountId, null, null);

              rpr.setPsoID(psoId);

              ...

SetPasswordRequest の例

コード例 8-8 は SetPasswordRequest の例です。

コード例 8-8 SetPasswordRequest の例

              SetPasswordRequest spr = new SetPasswordRequest();

              ...

              PSOIdentifier psoId = new PSOIdentifier(accountId, null, null);

              spr.setPsoID(psoId);

              spr.setPassword("newpassword");

              spr.setCurrentPassword("oldpassword");

              ...

ValidatePasswordRequest の例

コード例 8-9 は ValidatePasswordRequest の例です。

コード例 8-9 ValidatePasswordRequest の例

              ValidatePasswordRequest vpr = new ValidatePasswordRequest();

              ...

              PSOIdentifier psoId = new PSOIdentifier(accountId, null, null);

              vpr.setPsoID(psoId);

              vpr.setPassword("apassword");

              ...

Suspend 機能のサポート

Identity Manager は、表 8-7 で説明した Suspend 機能をサポートします。

表 8-7 Suspend 機能

機能

説明

オペレーショナル属性

相違点

ResumeRequest

PSO ユーザーを再開 (有効化) します。

なし

EffectiveDate をサポートしません。

EffectiveDate を設定すると、Identity Manager は OperationNotSupported エラーを返します。

SuspendRequest

アカウントや PSO を中断 (無効化) します。

なし

EffectiveDate をサポートしません。

EffectiveDate を設定すると、Identity Manager は OperationNotSupported エラーを返します。

サポートされない SPML 2.0 の機能

Identity Manager 7.0 では、Reference 機能、Search 機能、および Updates 機能はサポートされません。

加えて、サポートされているどの機能でも CapabilityData クラスは使用されないため、Identity Manager コードベースにはこのクラスをサポートするためのインフラストラクチャーはありません。これは、カスタム機能を実装する場合に重要です。OpenSPML 2.0 Toolkit では、整列化、非整列化などで CapabilityData がサポートされません。

Reference 機能がサポートされない理由

Identity Manager が参照をサポートしない理由は 2 つあります。Reference 機能は通常、ターゲット間、または同じターゲット上のオブジェクト間での参照に使用されます。

Identity Manager は正式には 1 つのターゲットしかサポートしないため、ターゲット間の参照は使用できません。また、Identity Manager でサポートされている (objectclass を使用して PSO の型にマップされる) repoType は User のみであり、これらのオブジェクトはほかのオブジェクトを参照しないため、現時点で Reference をサポートする必要性はありません。

Search 機能がサポートされない理由

現在、Search 機能のサポートは SPML 1.0 を通じてのみサポートされます。

Identity Manager で SPML 2.0 の Search 機能をサポートしない理由は、この機能によって実行される検索が現時点ではそれほど効率的でないためです。検索フィルタは完全なユーザービューに対して機能するため、すべての User オブジェクトを完全なビューにインスタンス化する必要があります。これはそれほど効率的ではありませんが、プロビジョニングシステムとしては必要です。この理由から、Identity Manager は検索の結果に対して、繰り返し処理 (または効率的な検索) を適切には提供できません。Search 機能の追加は、将来のリリースで対応される予定です。

Updates 機能がサポートされない理由

Identity Manager で Updates 機能がサポートされない理由は、この機能のために必要な情報である変更レコードを Identity Manager が追跡しないためです。


SPML 2.0 を使用するための Identity Manager の設定

SPML 2.0 を使用するために Identity Manager サーバーを設定するとき、最初に行うことは、ターゲットを通じて管理する属性の決定です。


ターゲットには複数の属性を割り当てることができます。


このインタフェースを使用する Identity Manager インスタンスでユーザーを管理するときに、インタフェースクライアントがどの属性セット (objectclasses) を使用するかを決定します。この属性セットが PSO です。

フォームを使用して、それらの属性をユーザービューとの間でマップする方法についても理解する必要があります。

この節では、spml2Person という DSML オブジェクトクラスに対して、次の属性を含む PSO を使用するシステムの設定方法について説明します。

これらの属性はユーザービューにマップされます。またこの節では、Identity Manager での SPML 2.0 サポートを使用して、これらの PSO の管理方法を説明する、簡単な例も示します。この設定は、製品に付属する sample/spml2.xml ファイルから派生したものです。このファイルを参照することで、詳しい情報を確認できます。

PSO の形式を決定したあとで、次の節で説明するサービスを有効にします。次の節では、web.xml ファイルと、SPML 2.0 で追加された要素について説明しています。

SPML2 設定オブジェクト

SPML 2.0 サポートの初期状態の設定は、sample/spml2.xml に定義されています。このファイルでは、SPML 2.0 をサポートするために Identity Manager で必要なオブジェクトを定義しています。

この節では、これらの設定型オブジェクトの 1 つである SPML2 について説明します。このオブジェクトを使用して、SPML 2.0 サポートの動作の変更やシステムの拡張を行います (拡張内容については、個別の節で詳しく説明する)。

次の例は、オブジェクトの注釈付きエクスポートです。

コード例 8-10 SPML2.XML オブジェクトの注釈付きエクスポート  

<Configuration name='SPML2' authType='SPML'>

    <Extension>

        <Object>

           

            <!-- このリスト内の各オブジェクトは、「executorClass」の組と、その組が
                 処理方法を知っている要求のセットを表す。要求のタイプは複数の executor の
                 組に出現する可能性がある。この結果、その型に対して executor の
                 チェーンが発生する。最初の executor がその型の与えられたインスタンスを
                 処理できない場合、要求はチェーン内の次の executor に渡される。
                 重要な点として、この executor のリストは順番に処理される。
                 一般に、このセクションは変更しない。
-->

            <Attribute name='executors'>

                <List>

                    <Object name='com.sun.idm.rpc.spml2.core.ListTargetsExecutor'>

                        <Attribute name="requests" value="org.openspml.v2.msg.
                             spml.ListTargetsRequest"/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.pass.PasswordRequestExecutor'>

                        <Attribute name='requests'>

                            <List>

                               <String>org.openspml.v2.msg.pass.SetPasswordRequest</String>

                             <String>org.openspml.v2.msg.pass.ResetPasswordRequest</String>

<String>org.openspml.v2.msg.pass.ValidatePasswordRequest</String>

<String>org.openspml.v2.msg.pass.ExpirePasswordRequest</String>

                            </List>

                        </Attribute>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.core.AddRequestExecutor'>

                        <Attribute name="requests"
                             value='org.openspml.v2.msg.spml.AddRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.core.DeleteRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spml.DeleteRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.core.LookupRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spml.LookupRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.core.ModifyRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spml.ModifyRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.suspend.SuspendRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlsuspend.SuspendRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.suspend.ResumeRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlsuspend.ResumeRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.suspend.ActiveRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlsuspend.ActiveRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.batch.BatchRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlbatch.BatchRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.bulk.BulkDeleteRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlbulk.BulkDeleteRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.bulk.BulkModifyRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlbulk.BulkModifyRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.async.StatusRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlasync.StatusRequest'/>

                    </Object>

                    <Object name='com.sun.idm.rpc.spml2.async.CancelRequestExecutor'>

                        <Attribute name='requests'
                             value='org.openspml.v2.msg.spmlasync.CancelRequest'/>

                    </Object>

                </List>

            </Attribute>

            <Attribute name='targets'>

                <List>

           

                    <!-- これはターゲットの名前である。読みやすく参照しやすいように
                         区切られている。これは、このオブジェクトの名前が「xmlTemplate」内の
                         $OBJECT_NAME$ 変数を置き換えるときに targetID になる。
-->

               

                    <Object name="spml2-DSML-Target">

           

                        <!-- ターゲットがプロファイルに添付されることを指定できる。
                            「xmlTemplate」内の $PROFILE_ATTRIBUTE$ を
                            「profile="<value>"」に置き換える。

                      -->

               

                        <Attribute name="profile" value="urn:oasis:names:tc:SPML:2:0:DSML"/>

           

                        <!-- これはターゲット定義である。最初の 2 行と最後の行は
                             (「targets」リスト内の各オブジェクトに対して) 常に同じ
                             である。
-->

               

                        <Attribute name='xmlTemplate'>

                            <String><![CDATA[

<target targetID="$OBJECT_NAME$" $PROFILE_ATTRIBUTE$>

    <schema>

        <spmldsml:schema xmlns:spmldsml="urn:oasis:names:tc:SPML:2:0:DSML">

            <spmldsml:attributeDefinition name="objectclass"/>

            <spmldsml:attributeDefinition name="accountId" description="Account Id"/>

            <spmldsml:attributeDefinition name="credentials" description="Credentials,
                e.g. password"/>

            <spmldsml:attributeDefinition name="firstname" description="First Name"/>

            <spmldsml:attributeDefinition name="lastname" description="Last Name"/>

            <spmldsml:attributeDefinition name="emailAddress" description="Email Address"/>

            <spmldsml:objectClassDefinition name="spml2Person">

                <spmldsml:memberAttributes>

                    <spmldsml:attributeDefinitionReference name="objectclass"
                        required="true"/>

                    <spmldsml:attributeDefinitionReference name="accountId" required="true"/>

                    <spmldsml:attributeDefinitionReference name="credentials"
                         required="true"/>

                    <spmldsml:attributeDefinitionReference name="firstname"/>

                    <spmldsml:attributeDefinitionReference name="lastname"/>

                    <spmldsml:attributeDefinitionReference name="emailAddress"/>

                </spmldsml:memberAttributes>

            </spmldsml:objectClassDefinition>

        </spmldsml:schema>

        <supportedSchemaEntity entityName="spml2Person"/>

    </schema>

    <capabilities>

        <capability namespaceURI="urn:oasis:names:tc:SPML:2:0:async"/>

        <capability namespaceURI="urn:oasis:names:tc:SPML:2:0:batch"/>

        <capability namespaceURI="urn:oasis:names:tc:SPML:2:0:bulk"/>

        <capability namespaceURI="urn:oasis:names:tc:SPML:2:0:pass"/>

        <capability namespaceURI="urn:oasis:names:tc:SPML:2:0:suspend"/>

    </capabilities>

</target>

                            ]]></String>

                        </Attribute>

                    </Object>

                </List>

            </Attribute>

           

                    <!-- これは spml.xml 設定の「classes」リストと同様である。ターゲットが
                         共通のオブジェクトクラス/型の名前を持つ場合に、1 つまたは複数の
                         ターゲットにマッピングを適用できるようにした。詳細は SPML 1.0 の
                         ファイルおよびドキュメントを参照。

                    -->

               

            <Attribute name='mappings'>

                <List>

                    <Object name='spml2Person'>

                        <Attribute name='type' value='User'/>

                        <Attribute name='form' value='spml2PersonForm'/>

                        <Attribute name='default' value='true'/>

                        <Attribute name='targets'>

                            <String>"spml2-DSML-Target"</String>

                        </Attribute>

                    </Object>

                    <Object name='request'>

                        <Attribute name='type' value='TaskInstance'/>

                        <Attribute name='filter'>

                            <AttributeCondition attrName='defName' operator='equals'

                                operand='SPML2Request'/>

                        </Attribute>

                    </Object>

                </List>

            </Attribute>

        </Object>

    </Extension>

</Configuration>

               

<!-- オブジェクトクラス内の属性をビューとの間でマップするフォームを定義する必要もある。次のフォー ムは spml2Person オブジェクトクラスに対してこのマッピングを行う。-->

                   

<Configuration name='spml2PersonForm' authType='SPML'>

    <Extension>

        <フォーム>

            <Field name='accountId'>

                <Derivation>

                    <ref>waveset.accountId</ref>

                </Derivation>

            </Field>

            <Field name='waveset.accountId'>

                <Expansion>

                    <ref>accountId</ref>

                </Expansion>

            </Field>

            <Field name='emailAddress'>

                <Derivation>

                    <ref>waveset.email</ref>

                </Derivation>

            </Field>

            <Field name='global.email'>

                <Expansion>

                    <ref>emailAddress</ref>

                </Expansion>

            </Field>

            <Field name='objectclass'>

                <Derivation>

                    <ref>accounts[Lighthouse].objectclass</ref>

                </Derivation>

            </Field>

            <Field name='accounts[Lighthouse].objectclass'>

                <Expansion>

                    <ref>objectclass</ref>

                </Expansion>

            </Field>

            <Field name='credentials'>

                <Derivation>

                    <ref>password.password</ref>

                </Derivation>

            </Field>

            <Field name='password.password'>

                <Expansion>

                    <ref>credentials</ref>

                </Expansion>

            </Field>

            <Field name='lastname'>

                <Derivation>

                    <ref>accounts[Lighthouse].lastname</ref>

                </Derivation>

            </Field>

            <Field name='global.lastname'>

                <Expansion>

                    <ref>lastname</ref>

                </Expansion>

            </Field>

            <Field name='firstname'>

                <Derivation>

                    <ref>accounts[Lighthouse].firstname</ref>

                </Derivation>

            </Field>

            <Field name='global.firstname'>

                <Expansion>

                    <ref>firstname</ref>

                </Expansion>

            </Field>

        </Form>

    </Extension>

</Configuration>

           

web.xml

web.xml の次のセクションでは、SPML 2.0 要求を処理するサーブレットである openspmlRouter サーブレットを設定します。


web.xml のこのセクションには、出荷時点でデフォルトのインストールが定義されており、このコンポーネントに対するアクションは必要ありません。


コード例 8-11 openspmlRouter サーブレットの設定  

<servlet>

    <servlet-name>openspmlRouter</servlet-name>

    <display-name>OpenSPML SOAP Router</display-name>

    <description>A router of RPC traffic - nominally SPML 2.0 over SOAP</description>

    <servlet-class>

        org.openspml.v2.transport.RPCRouterServlet

    </servlet-class>

    <init-param>

        <param-name>dispatchers</param-name>

        <param-value>org.openspml.v2.transport.SPMLViaSoapDispatcher</param-value>

    </init-param>

    <init-param>

        <param-name>trace</param-name>

        <param-value>false</param-value>

    </init-param>

    <init-param>

        <param-name>SpmlViaSoap.spmlMarshallers</param-name>

        <param-value>com.sun.idm.rpc.spml2.UberMarshaller</param-value>

    </init-param>

    <init-param>

        <param-name>SpmlViaSoap.spmlMarshallers.UberMarshaller.trace</param-name>

        <param-value>true</param-value>

    </init-param>

    <init-param>

        <param-name>SpmlViaSoap.spmlExecutors</param-name>

        <param-value>com.sun.idm.rpc.spml2.UberExecutor</param-value>

    </init-param>

</servlet>

           

このファイルには、オプションの init-param が含まれています。このパラメータは、SPML 2.0 メッセージのフローを表示する (Swing の) 監視ウィンドウを開くために追加できます。この監視ウィンドウはデバッグに役立ちます。

追加内容の例を次に示します。

<init-param>

    <param-name>monitor</param-name>

<param-value>org.openspml.v2.util.SwingRPCRouterMonitor</param-value>

</init-param>

次のコメント付きのセクション例では、その他の init-params についての情報を提供しています。

コード例 8-12 コメント付きの例  

<servlet>

    <servlet-name>openspmlRouter</servlet-name>

    <display-name>OpenSPML SOAP Router</display-name>

    <description>A router of RPC traffic - nominally SPML 2.0 over SOAP</description>

    <servlet-class>

    org.openspml.v2.transport.RPCRouterServlet

    </servlet-class>

           

    <!--

        Router はディスパッチャーを使用して SOAP メッセージを処理する。これは、ツールキット内の
        SOAP に対応した対応したディスパッチャーである。命名規則を介した独自のパラメータを持つ。
        次を参照。

    -->

               

    <init-param>

        <param-name>dispatchers</param-name>

        <param-value>org.openspml.v2.transport.SPMLViaSoapDispatcher</param-value>

    </init-param>

           

    <!--

        トレースを有効にし、サーブレットが情報メッセージをログに書き込むようにする。

    -->

               

    <init-param>

        <param-name>trace</param-name>

        <param-value>false</param-value>

    </init-param>

           

    <!--

          先に定義した SpmlViaSOAPDispatcher は整列化処理 (Marshaller) を使用する。
          XML および SPML のオブジェクト間で移動を行うためのチェーンが存在する可能性がある。
          この目的のために実装した UberMarshaller を使用する。これは実際にはツールキットの
          クラスを変換したものである。

    -->

    <init-param>

        <param-name>SpmlViaSoap.spmlMarshallers</param-name>

        <param-value>com.sun.idm.rpc.spml2.UberMarshaller</param-value>

    </init-param>

           

    <!--

          ここで使用する UberMarshaller は独自のトレース設定を持つ。このリリースでは、
          この設定は実際には何も行わない。

    -->

               

    <init-param>

        <param-name>SpmlViaSoap.spmlMarshallers.UberMarshaller.trace</param-name>

        <param-value>true</param-value>

    </init-param>

           

    <!--

      最後に、ディスパッチャーは機能を実際に実装する executor のリストを持つ。
      要求を受け取ると、SOAP エンベロープを除去し、XML から本体を抽出して OpenSPML Request
      クラスに渡し、要求を処理できるかどうかを executor のリストに問い合わせる。
      ここでは UberExecutor を定義した。この executor は要求をほかの executor に
      再振り分けする。ほかの executor は spml2.xml (Configuration:SPML2) で指定される。

    -->

               

    <init-param>

        <param-name>SpmlViaSoap.spmlExecutors</param-name>

        <param-value>com.sun.idm.rpc.spml2.UberExecutor</param-value>

    </init-param>

</servlet>

           

次の節では、いくつかの注釈付きで spml2.xml を説明します。


システムの拡張

設定オブジェクトを変更することによって、スキーマを拡張します。セクションを変更することにより、要求の executor を追加できます。フォームを使用して、DSML とビューの間でマッピングを行うことができます。

少し難しくなりますが、ディスパッチャー、整列化クラス、および UberExecutor を、カスタマイズしたものと置き換えることもできます。

SPML 2.0 は広く開かれたプラグイン可能性を提供しており、これは Identity Manager で OpenSPML 2.0 Toolkit を利用することによって実現されています。図 8-1 は、OpenSPML 2.0 Toolkit のアーキテクチャーを示しています。

図 8-1 OpenSPML 2.0 Toolkit のアーキテクチャー

OpenSPML2 Toolkit のアーキテクチャーを説明した図


SPML 2.0 アダプタの例

Identity Manager には、サンプルの SPML 2.0 リソースアダプタが用意されています。このアダプタを変更して使用することにより、複数の Identity Manager 7.0 インストールや、SPML 2.0 コア操作をサポートするサードパーティーのリソースに接続することができます。


このサンプルアダプタは、製品 CD またはインストールイメージ上 (/REF に格納されている) の Sun Resource Extension Facility Kit に収録されています。




前へ      目次      次へ     


Part No: 820-1583.   Copyright 2006 Sun Microsystems, Inc. All rights reserved.