Cisco Service Portal インテグレーション ガイド リリース 9.3.2
ディレクトリ統合と API
ディレクトリ統合と API
発行日;2012/07/26 | ドキュメントご利用ガイド | ダウンロード ; この章pdf , ドキュメント全体pdf (PDF - 5MB) | フィードバック

目次

ディレクトリ統合と API

概要

はじめに

前提条件

目的および対象範囲

対象読者

ディレクトリ統合要件の収集

概要

データソースの定義

マッピングの定義

必須マッピング

オプションのマッピング

カスタム マッピング

統合イベント、操作、および手順の定義

イベント

操作

Login イベント

シングル サインオン操作

外部ユーザ認証(EUA)操作

Person Lookup イベント

Person Search 操作

Import Person 操作

Import Manager 操作

カスタム コード操作

ディレクトリ統合の設定

ディレクトリ統合の有効化

ディレクトリ統合の設定

データソース情報の設定

データソースの追加または編集

接続情報の設定

証明書の設定

照会用データソースの設定

接続のテスト

マッピングの設定

マッピング タイプ

簡易マッピングと複合マッピング

式マッピング

Java クラス マッピング

マッピングのテスト

ディレクトリ マップ テスト機能の有効化

データ マッピング テスト コントロールの使用

ディレクトリ統合イベントの設定

ディレクトリ統合でのカスタム コードの使用

カスタム コード操作インターフェイス

Login イベント カスタム コード インターフェイス:ISignOn

Person Lookup のカスタム コード インターフェイス:IPersonSearch

カスタム Java クラス マッピング インターフェイス

属性マッピングに対するカスタム Java クラス:IEUIAttributeMapping

Directory Server API

ILDAPApi のインスタンスの取得:API 実装

ディレクトリ統合ユーティリティ(EUIUtil)クラス

LDAP 設定情報(LDAPConfigInfo)クラス

API のメイン インターフェイス:ILDAPApi

LDAPEntryBean

個人のインポート/更新 API

個人のインポート/更新 API インターフェイス:ISignOnImportPersonAPI

ベスト プラクティス

カスタム コード Java ファイルのコンパイル

コーディングのガイドライン

パッケージ名

ロギング

例外処理

Administration モジュールでのカスタム コードの設定

ステップ 1:グローバル設定の実行

ステップ 2:データソースの設定

ステップ 3:属性マッピングの設定

ステップ 4:イベント/カスタマイズ イベントの設定

カスタム コードの導入

API のビュー/用途の例

SQL データソース

データソースの定義

マッピングの例

イベントの設定例

SQL ベースの個人検索のサンプル コード

サポートされるタイム ゾーン

build.xml ファイルの例

概要

はじめに

Cisco Service Portal(Service Portal)ディレクトリ統合は、一元化されたユーザ認証およびエンタープライズ ディレクトリとの同期を実装することによって、セキュリティ管理を簡略化し、ユーザの利便性と生産性を向上します。

Service Portal では、カスタマーは(通常は LDAP プロトコルを使用して)外部ディレクトリと統合し、ユーザ情報を同期することができます。この同期は、ユーザが Order-on-behalf(OOB)で選択されたとき、または Person Lookup 時に起動されます。

シングル サインオン(SSO)の統合により、一元管理されたユーザ認証が可能になり、個別のログイン メカニズムが不要になります。SSO イベントを有効にすると、Service Portal が統合されているエンタープライズ ポータルにすでにログインしているユーザは、ログインし直す必要がありません。ユーザ認証データは、アプリケーション データベースに格納されます。Service Portal は SSO ツールを利用して Demand Center および Request Center のすべての URL を保護し、認証を実行します。Service Portal は、SSO ツールが、成功したそれぞれの認証に対する個人の認識情報を、HTTP ヘッダーで Service Portal URL に提供することを前提としています。認証されると、それらの情報をアプリケーション データベースと同期することができます。

SSO が有効でない場合は、Service Portal のログイン画面がすべてのユーザに表示され、ユーザは正しいユーザ名とパスワードの組み合わせを入力することができます。デフォルトでは、これらのクレデンシャルは内部データベースで認証されます。または、外部システム(通常は LDAP ディレクトリ)で認証するよう、Directory Integration を設定することもできます。Service Portal にアクセスするすべてのユーザは、認証が正常に行われるように、このソース内に存在している必要があります。

Directory Integration Framework は、頻繁に導入される SSO およびディレクトリ サーバ製品に対して、Administration モジュールで使用できる設定オプションを通じて上記の機能を提供します。フレームワークには、定義済みの設定機能を補完可能なアプリケーション プログラミング インターフェイス(API)も含まれています。プログラマは API を使用して追加の SSO ポータルやディレクトリ サーバにアクセスできるだけでなく、Service Portal と外部ディレクトリの間でユーザ情報が同期されるよう、デフォルトの動作を変更または補完できます。

前提条件

ディレクトリ統合の設定では、次のことが必要です。

Service Portal インストールが作動していること。

ディレクトリ サーバがインストールされ、ディレクトリに会社データが入力されていること。潜在的なすべてのユーザに対するディレクトリ エントリでは、「マッピングの定義」 で説明されているように、統合処理で必要なフィールドにマップされるすべての属性についてヌル以外の値が含まれている必要があります。

シングル サインオン(SSO)を使用する場合は、認証および承認を行う SSO システムが Service Portal にアクセスします。

ユーザは、「グローバル設定の管理」機能が含まれたロールでログインします。この機能は、「Site Administrator」ロールに自動的に含まれ、「admin」ユーザに割り当てられます。ただし、必要に応じて、Administration モジュールの Roles オプションを使用して他のロールまたはユーザに割り当てることもできます。

LDAP ブラウザにアクセスすることを強く推奨します。

目的および対象範囲

この章では、Administration モジュールを使用して Service Portal に対してディレクトリ統合を設定する方法について説明します。また、有効な統合オプションのカスタマイズで使用できる公開 API とインターフェイスのセット、カスタム コードをコンパイルおよび導入するためのベスト プラクティス、Administration モジュールを使用してカスタム コードを設定するための手順についても説明します。

対象読者

この章は、ソフトウェアのカスタマイズおよび統合を行うエンジニアを対象としています。

ディレクトリ統合要件の収集

概要

ディレクトリ統合を設定するには、SSO の現在の実装(使用している場合)および社内のディレクトリ サーバに関する有用な情報を入手し、これらのシステムを Service Portal に統合するための要件を文書化する必要があります。ここでは、この情報を収集するためのワークシートをいくつか示します。

これらのワークシートは、ディレクトリ/SSO 統合を設定したり、統合を実装する前に解決すべき問題を特定したりするのに必要な情報を収集するうえで役に立ちます。また、ディレクトリ統合で必要な開発およびテストの時間を見積もる場合にも有用です。

データソースの定義

Service Portal は、アクセスされる個人データおよび組織データを格納する各ディレクトリに対して「データソース」を定義します。データソースの定義には、外部ディレクトリへの接続で必要なすべての情報、およびそのディレクトリからの抽出情報が含まれています。

各外部ディレクトリに対して 1 つのデータソースを定義する必要があります。たとえば、開発と実稼働で別のディレクトリを使用することができます。また、Service Portal は LDAP ディレクトリ照会をサポートしており、データソースは参照チェーン内の各ディレクトリに対して定義する必要があります。

設定
説明

Datasource Name

データソースの名前。空白または特殊文字は使用しないでください。

Datasource Description

データソースの説明(オプション)。

Protocol

LDAP

現時点でサポートされているプロトコルは LDAP だけです。他のプロトコルを使用してディレクトリ情報を格納する場合は、この情報にアクセスするためのカスタム コードを作成する必要があります。

Server Product

Sun™ ONE Directory

Microsoft® Active Directory®

IBM® Tivoli®

使用するディレクトリ サーバ製品を選択します。現時点でサーバがサポートされていない場合は、サーバにアクセスするためのカスタム コードを作成し、ディレクトリ情報を抽出する必要があります。

Authentication Method

Simple

Anonymous

SASL

Simple はプレーン テキストのユーザとパスワードを表します。 SASL (Simple Authentication and Security Layer)も使用できますが、SASL は Sun ONE Directory Server でのみ機能します。

Connection Mechanism

SSL

Non SSL

認証方法として Simple または SASL を選択した場合のみ必要です。

暗号化された情報を送信するには、 SSL を選択します。

BindDN

バインドの識別名フィールド。BindDN は、Service Portal がディレクトリ操作を実行するときに LDAP サーバに接続するために使用されます。

そのためにサービス アカウントを作成します。

このデータソースを外部認証の手順で使用する場合は、[Options] 領域に EUA Bind DN を指定してこの値を変更します。詳細については、「外部ユーザ認証(EUA)操作」を参照してください。

Host

LDAP ディレクトリ サーバの完全修飾ホスト名または IP アドレス。

Port Number

ディレクトリ サーバに接続するためのポート番号。通常、SSL 以外のアクセスにはポート番号 389 を使用します。

Password

認証で Simple または SASL を選択した場合に必要です。Bind DN に指定されたユーザのパスワードです。アカウントでパスワード エージングを使用する場合は、このパスワードを定期的に更新する必要があります。

User BaseDN

ディレクトリ内の個人の検索を開始するディレクトリ。社内ディレクトリには多くのブランチが含まれることがあるため、ユーザ データに対してベース DN を指定することによって、ディレクトリ検索が最適化されます。

AuthzID

SASL 認証を選択した場合に必要です。

Optional Filter

このフィルタは、使用する他の検索フィルタに追加されます。このフィルタを使用して、検索結果を効果的に変更できます。フィルタ式はカッコで囲む必要があります。たとえば、次のフィルタがあるとします。

(&(!(msExchHide=true)(ISC-GID=*)))

この場合、msExchHide 属性が true で、ISC-GID 属性が定義されているエントリだけが返されます。

Security Certificate Name

接続メカニズムに SSL を選択した場合に必要です。

証明書のエイリアス名には、スペースや特殊文字を使用しないでください。

証明書のデータを入力する準備ができていることを確認してください。

Referral Datasource

1 つ以上のデータソースを照会用として追加できます。データソース検索で結果が返ってこない場合、システムは照会用のデータソースも検索します。照会は、検索でのみサポートされており、バインディングではサポートされていません。

循環照会は設定できません。循環照会は、あるデータソースが照会用として別のデータソースを持っており、同時にそのデータソースが、照会用として元のデータソースを使用しているものです。たとえば、データソース A が照会用としてデータソース B を持っており、データソース B が照会用としてデータソース A を持っている場合です。

マッピングの定義

「マッピング」は、外部ディレクトリから Service Portal へデータをどのように転送するか、という指示を与えるルール セットです。これにより、ディレクトリ内のソース属性と、Service Portal データベース内のターゲット フィールド間がマッピングされます。Service Portal データベースがディレクトリと同期されるとき、これらのルールを使用して、ディレクトリのデータを、指定されたターゲット フィールドへ転送します。

 

同じマッピングを複数のディレクトリ(データソース)に適用できます。

マッピングには、ユーザ/個人のプロファイルと、関連するすべてのエンティティ(住所、連絡先、場所、1 つ以上のグループ関係、1 つ以上の組織単位(OU)関係、1 つ以上の RBAC(ロールベース アクセス コントロール)ロール関係など)が含まれます。

個人のプロファイルには、7 個の必須フィールドが含まれており、これらのフィールドは以下のマッピング ワークシートの「必須」セクションにリストされています。これらのどのフィールドについても値を提供していないディレクトリ レコードはインポートできません。その他のフィールドで、個人プロファイルの一部になっているものもマップできます。これらのフィールドの概要については、個人の情報を保守するための Organization Designer で使用する画面で確認してください。

個人プロファイルの大半のフィールドはアプリケーション プロセスで使用されます。マッピングでは、マップされる属性が、フィールドに対して適切なソース値を提供していることを確認する必要があります。つまりこれらのフィールドに対して、フィールド名によって示されるよりも多くの情報、またはフィールド名に一致しない情報を指定しないようにします。

Service Portal には、標準の個人データを拡張するフィールドも含まれています。これらのフィールドは、以下の表では「拡張」として記載されており、Organization Designer の Person 情報の [Extensions] ページに表示されます。頻繁に必要とされるいくつかの拡張フィールドには、意味のある名前(Company Code、Division など)が割り当てられていますが、他のフィールドには Custom 1 から Custom 10 までの名前が付けられています。これは自由に使用することを意図しているもので、事前に考えられている意味はありません。LDAP ディレクトリに追加の個人情報があり、Request Center で公開する必要がある場合は、この情報が含まれている属性を、個人の拡張フィールドの 1 つにマップします。

以下のワークシートの「Directory Attribute」カラムは、個人プロファイルのすべてのフィールドについて値を挿入する必要があります。このフィールドには、ディレクトリがデータを提供します。属性には次のいずれかを指定できます。

ディレクトリの属性名。複数の属性を(オプションのリテラルを付けて)連結し、フィールドの値を構成する場合は複数の属性名。

「カスタム マッピング」、およびそれに続く番号または説明。すべてのカスタム マッピングは、「カスタム マッピング」に詳細を記述するか、「Comments」カラムに簡単に説明を記載する必要があります。カスタム マッピングは、正規表現の結果を属性に割り当てることも、カスタム Java コードのモジュールを介して実装することもできます。これらのマッピングの実装の詳細は、「マッピングの設定」に示してあります。

必須マッピング

 

フィールド
コメント

First Name

Last Name

Login ID

Service Portal で個人のログイン名として使用される固有識別子。

Person Identification

Person Identification は、各個人に対して一意の値を提供する属性にマップする必要があります。たとえば、従業員 ID や社会保障番号が格納されている属性を指定します。理想的には、Login ID と Person Identification の両方に同じ属性をマップする必要があります。最低限、これらの 2 つのフィールドは密接に関連付ける必要があります。

Email Address

Home Organizational Unit

ホーム OU は必ず事業部門とします(サービス チームにはしません)。

Password

ディレクトリ サーバは通常、パスワードを返しません。ただしこのフィールドを使用して、新しいユーザのデフォルト パスワードなどを作成できます。

オプションのマッピング

 

フィールド
コメント

Title

Social Security Number

Birthdate

マップされる LDAP 属性の戻り値の型は、long にする必要があります。Service Portal は他の形式をサポートしていません。

Hire Date

マップされる LDAP 属性の戻り値の型は、long にする必要があります。Service Portal は他の形式をサポートしていません。

Timezone ID

マップされる属性は、次の形式のいずれかの値を返す必要があります。

GMT+- オフセット

国/言語

2008 年 3 月以降、一般的に使用されていた 3 文字のタイム ゾーン指定(東部標準時は「EST」など)は使用されなくなりました。上記の形式についてサポートされている値のリストは、「サポートされるタイム ゾーン」を参照してください。戻り値が、正しい形式のどれにも一致しない場合、Service Portal はデフォルトのタイム ゾーンとして PST を使用します。

Locale ID

マップされた属性は、次の形式で値を返す必要があります。

language_COUNTRY

language は 2 文字の言語コードで、country は 2 文字の国コードです。

Directory integration は次のロケールをサポートしています。

en_US(米国英語)

de_DE(ドイツ語)

es_ES(スペイン語)

fr_FR(フランス語)

ja_JP(日本語)

zh_CN(簡体字中国語)

zh_TW(繁体字中国語)

Employee Code

Supervisor

このフィールドはマネージャの ID を表します。詳細については、「Import Manager 操作」を参照してください。

Notes

Company Street 1

Company Street 2

Company City

Company State

Company Postal Code

Company Country

Building

Level

Office

Cubicle

Personal Street 1

Personal Street 2

Personal City

Personal State

Personal Postal Code

Personal Country

Work Phone

Home phone

Fax

Mobile Phone

Pager

Other

Main Phone

Primary Phone

Primary Fax

Sales Phone

Support Phone

Billing Phone

Other Contact Information

Company Code

拡張

Division

拡張

Business Unit

拡張

Department Number

拡張

Cost Center

拡張

Management Level

数値を返す必要があります。このフィールドが Import Manager イベントで使用された場合、階層に従って Management Level が大きくなるようにしてください。たとえば、Junior Engineer と Senior Engineer の 2 つの指定があった場合、Junior Engineer に対して返される Management Level は、Senior Engineer の Management Level よりも小さくなる必要があります。

Region

拡張

Employee Type

拡張

Location Code

拡張

Custom 1

拡張

Custom 2

拡張

Custom 3

拡張

Custom 4

拡張

Custom 5

拡張

Custom 6

拡張

Custom 7

拡張

Custom 8

拡張

Custom 9

拡張

Custom 10

拡張

Organizational Unit List

このマッピングを使用して、個人を 1 つ以上の組織単位に関連付けます。マッピングでは、複数の値が返されることがあります。このフィールドに対して、Service Portal は複数値の LDAP 属性で返されるすべての値を使用します。このフィールドの入力は、次の形式のいずれかにする必要があります。

Directory Integration API ドキュメントの定義に従って複数値を返す Java クラスの名前。

「::」で区切った 1 つ以上の簡単なマッピング。
例:ou::departmentNumber

次のように、「::」で区切った 1 つ以上の式のマッピング
expr:#memberOf#=(cn=(.*),cn=Users,dc=celosis,dc=com)?($1):Default:: expr:#memberOf#=(cn=(.*),ou=Users,dc=celosis,dc=com)?($1):Default

Group List

Organizational Unit List と同様です。

Role List

Organizational Unit List と同様です。返されるロールは、システム定義またはユーザ定義のいずれかです。

システム定義ロールの場合、名前は言語が米国英語のときにブラウザに表示されるものと同一にする必要があります。他の言語はサポートされていません。たとば、ユーザに「My Services Executive」ロールを関連付けるには、このロールが返される必要があります。

ユーザ定義ロールの場合、この名前は、ロールの作成時にユーザ言語で入力した名前と完全に一致している必要があります。

カスタム マッピング

以下のワークシートを使用して、カスタム マッピングの要件を文書化できます。

 

フィールド
タイプ
要件

表現

Java

表現

Java

統合イベント、操作、および手順の定義

統合イベントは Service Portal と外部ディレクトリや SSO プログラムとの間のインターフェイスです。外部プログラムまたはディレクトリにアクセスする Service Portal を使用しているときだけのものです。これらのイベントは、順次実行される複数の操作によって構成されています。

イベント

Service Portal は、次の 4 つのディレクトリ統合イベントをサポートしています。

Login 」イベントは、ユーザのクレデンシャルが検証され、ユーザが Service Portal に接続したときに発生します。このイベントは、ユーザが最初に Service Portal セッションを開始したときに発生します。また、セッションがタイムアウトし(管理者が指定したタイムアウト期間が経過)、再接続が必要な場合にも発生します。

Person Lookup 」イベントは、ユーザ情報が取得されるたびに発生します。実際には、次の 3 つのタイプの Person Lookup イベントがあります。

Person Lookup for Order on Behalf :あるユーザが他の個人の代わりにサービスを要求し、そのサービスのカスタマーとなっている個人を選択する必要があります。

Person Lookup for Service Form :サービス フォームに [Person] フィールドが含まれ、これによってユーザが他の個人をサービス データの一部として指定できます。

Person Lookup for Authorization Delegate :サービスの確認または承認を行うユーザが、他の個人を一時的な代理承認者として指定するために、自身のプロファイルの変更を要求します。

操作

さまざまな種類の操作を実行するよう、イベントを設定できます。操作は、各イベントに対して複数の手順で指定します。これにより、各操作が呼び出される順序が決まります。

ディレクトリ フレームワークには次の操作が含まれています。

Single Sign-On (SSO; シングル サインオン)は常に Login イベントの最初の手順です。SSO 操作は、ユーザのログイン名を識別します。

External Authentication は SSO 操作の後に発生するか、または SSO を使用しない場合は、デフォルトの [Login] 画面の後に発生します。外部認証はユーザのログイン名とパスワードを使用して、外部データソースに対してユーザを認証します。

Person Search は、ユーザがデータソース上で検索を呼び出したときにトリガーされます。Person Search はユーザの First Name と Last Name を使用して、一致した項目のリストを出力します。

Import Person は、外部認証の後、または SSO の後に発生するか、[Person Search] ダイアログで個人が選択された後で発生します。Import Person は、検索されている個人、またはログインしている個人のログイン名を使用し、データソースに問い合わせて、個人をデータベースにインポートします。

Import Manager は、個人のインポート後のみで発生します。Import Manager 操作は、インポートされた個人情報を使用して、このユーザのマネージャをインポートします。

各操作は、カスタム コード インターフェイスの実装によってカスタマイズできます。

次の図は、操作がトリガーされる順序を示しています。

図 1-1 トリガー順序

 

Login イベント

ディレクトリ統合のログイン イベントが設定されていない場合は、デフォルトでログイン画面が表示され、アプリケーション データベースに対して入力されたクレデンシャル(ユーザ名とパスワード)が検証されます。

ディレクトリ統合イベントが有効になっている場合は、最初の手順として、次のいずれかの操作を使用して Login イベントを設定できます。

シングル サインオン:すべてのユーザが SSO ベンダーを使用して事前に認証されている社内環境では、要求ヘッダーまたは CGI ヘッダーからユーザのログイン ID を自動的に抽出し、アプリケーションのログイン画面を表示せずに透過なログインを可能にします。

外部ユーザ認証:アプリケーションのログイン画面を表示し、指定した外部ディレクトリに対して入力されたクレデンシャルを検証します。外部ユーザ認証は、SSO 操作の後にも発生することがあります。

ユーザのクレデンシャルが検証されると、Login イベントには、外部データベースと Service Portal 間でユーザ データを同期するために、次の操作が含まれることがあります。

「Import Person」操作がその次の手順です。この操作は、選択された認証済みの個人プロファイルを Service Portal にインポートし、データと同期します。

「Import Manager」の操作は、「Import Person」手順の次の操作です。この操作は、外部ディレクトリから、選択された人のマネージャに関する情報を取得し、その情報を使用して Service Portal データベースを更新します。

シングル サインオン操作

シングル サインオン(SSO)ソリューションとの統合では、次の 2 つのメカニズムやプロトコルのいずれかを使用できます。

1. Active Directory Services(ADS)/NT LAN Manager(NTLM)ベースの認証済みユーザ

Service Portal へのログインに、サードパーティの IM/AM/SSO 製品は必要ありません。

ログインしたユーザの、POSIX 準拠 OS のクレデンシャルが、ブラウザによって Service Portal に返されます。

これは、SSO の CGI ヘッダーによる統合とも呼ばれます。

2. HTTP 要求ヘッダー

これは非 ADS/NTLM 統合です。

http プロトコルで要求ヘッダーを使用して Service Portal にログインするために、サードパーティの IM/AM/SSO 製品が必要です。

Portlet と Directory Integration の両方で SSO の使用を計画しているカスタマーについては、HTTP ヘッダー SSO のみがサポートされます。Directory Integration フレームワークのカスタム SSO プラグインはサポートされていません。

設定
説明

Single Sign-On Type

HTTP Header

Remote User

使用する SSO ソリューションに応じてタイプを指定します。ログイン ID 情報にアクセスできることを確認してください。

http 要求ヘッダー プロトコルを使用する場合は HTTP Header をチェックします。

ADS/NTLM プロトコルを使用する場合は Remote User をチェックします。

Login ID Mapping

HTTP サインオンに対する Login ID マッピングは、サインインしているユーザのログイン名が含まれている Http 要求ヘッダー内の名前と同じ名前にする必要があります。

ADS/NTLM サインオンに対する Login ID マッピングは、次の形式にする必要があります。

#AnyDomain#¥#LoginId#

たとえば celosis¥#LoginId# は、ユーザが「celosis」ドメインに制限されますが、#AnyDomain#¥#LoginId# は複数のドメインでログインができます。

複数のドメインを使用している場合、LoginId はドメイン間で一意にする必要があります。

Redirect URL

通常、ユーザが Service Portal 製品にアクセスする社内ポータルの URL。認証に失敗した場合、またはアプリケーション ユーザ セッションがタイム アウトになった場合に、ユーザはこの URL にリダイレクトされます。

IWA と Active Directory および JBOSS

JBOS インストール環境で Active Directory を使用した IWA でシングル サインオンを有効にするには、tomcat 認証をオフにしておく必要があります。

tomcat 認証をオフにするには、次の手順に従います。


ステップ 1 次のファイルをエディタで開きます。

< Request Center installation directory >¥jboss-4.2.3.GA¥server¥RequestCenter¥deploy¥jboss-web.deployer¥server¥ jboss-service.xml

ステップ 2 次のセクションを修正して、tomcatAuthentication が false になるようにします。

<!-- Define an AJP 1.3 Connector on port 8009 -->
<Connector port="8999" address="${jboss.bind.address}" protocol="AJP/1.3"
emptySessionPath="true" enableLookups="false" redirectPort="8443" tomcatAuthentication="false" />
 

ステップ 3 次のセクションを修正して、tomcatAuthentication が false になるようにします。

<Connector port="8088" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true"
tomcatAuthentication="false"/>
 

ステップ 4 ファイルを保存して、閉じます。


 

Tomcat のラージ パケット サイズの設定

シングル サインオン情報は http ヘッダーに格納されます。http ヘッダーのサイズが非常に大きい場合は、JBoss の Tomcat サーバの「maximum packet size」パラメータの値を大きくする必要があります。Tomcat のデフォルトの「maximum packet size」は 8192 バイトです。この数値は、以下に示す手順によって大きくできます。最大値は 65536 バイトです。


ステップ 1 JBoss マシンで、「<S ervice Portal_Install_Di r>¥jboss-4.2.3.GA¥isapi¥conf」ディレクトリにある「 worker.properties 」ファイルを探します。

ステップ 2 テキスト エディタを使用して、worker.properties ファイルの「Define Node1 worker」というセクションに次のパラメータを追加します。

worker.node1.max_packet_size=<number>
 

ここで、 <number> は次のように 8192 よりも大きい整数値にします。

worker.node1.max_packet_size=32000
 

ステップ 3 「< Service Portal_Install_Dir >¥jboss-4.2.3.GA¥server¥RequestCenter¥deploy¥jboss-web.deployer」ディレクトリにある、「 server.xml 」ファイルを探します。

ステップ 4 テキスト エディタを使用して server.xml ファイルを次のように修正します。

文字列 Connector port="8999" を検索します。

パラメータ packetSize="<number>" を追加します。 <number> は上記のステップ 2 の値と同じものとします。

たとえば、最初にテキストは次のようになっています。

Connector port="8999" address="${jboss.bind.address}" protocol="AJP/1.3"
emptySessionPath="true" enableLookups="false" redirectPort="8443"
tomcatAuthentication="false" />
 

修正後のテキストは次のようになります。

Connector port="8999" address="${jboss.bind.address}" protocol="AJP/1.3"
emptySessionPath="true" enableLookups="false" redirectPort="8443"
tomcatAuthentication="false" packetSize="32000" />
 

ステップ 5 Request Center サービス、および IIS Web サーバを再起動します。


 

SSO の管理バイパス

一部のユーザでシングル サインオンをバイパスして Service Portal に直接ログインできるようにすることが、必要になることがあります。この機能は通常、次のユーザにとって必要です。

シングル サインオンでの問題を調査する必要があるシステム管理者

サービス設計およびタスク計画を検証するために、複数ユーザのパフォーマンスをエミュレートする必要があるテスト担当者

Service Portal には、ユーザがログイン画面にアクセスし、ユーザ名とパスワードを入力できるようなメカニズムが用意されています。newscale.properties ファイル(RequestCenter.ear にあります)では「BackDoorURLParam」の値が指定されます。たとえば、次のようになります。

BackDoorURLParam=AdminAccess
 

ログイン画面から Service Portal にアクセスするために使用する URL には、パラメータを含める必要があります。たとえば backDoorURLParam の上記の値について、サンプル URL は次のようになります。

http://prod.RequestCenter.com/RequestCenter?AdminAccess=true
 

会社のガイドラインに従って BackDoorURLParam の値の期限切れについてポリシーを設定したり、Service Portal への管理アクセスの制御についてポリシーを設定したりすることは、管理者が行います。管理 URL でアクセスできるのは、対応する管理者設定によって「Site Administrator」ロールを付与されたユーザだけです。

 

管理者は、ユーザが URL に直接アクセス可能なことも確認する必要があります。以前は、Service Portal アプリケーションへのアクセスが、Web サーバまたはネットワーク設定パラメータを介した SSO ソフトウェアによるアクセスに制限されていました。

Request Center サービスを再起動して、このパラメータに対する変更を有効にする必要があります。

外部ユーザ認証(EUA)操作

外部認証を使用して、すべての Service Portal ユーザを社内ディレクトリで認証します。この方法では、ユーザ パスワードの同期を気にする必要がありません。

外部ユーザ認証は、ログインの試行後に、設定済みのシングル サインオン操作またはアプリケーションのログイン画面から行う必要があります。前の操作で取得した LoginId は EUA 操作で使用できます。ただし、このユーザを外部ディレクトリで検証する場合には、BindDN を見つけられるように、追加情報が必要になります。

EUABindDN 設定により、アプリケーションで、サインオンしようとしているユーザのバインド DN を自動的に推定できます。

設定
説明

External Authentication EUABindDN

EUABindDN の形式は次のとおりです。

Prefix#LoginId#Suffix.
 

Service Portal は #LoginId# を、EUABindDN からサインインしようとしているユーザの loginId に置き換え、これを BindDN として認証で使用します。

たとえば、EUABindDN を次のようにできます。

uid=#LoginId#,OU=People,dc=example,dc=com
 

このような場合、ユーザがサインアップの論理画面でログイン ID として scarter を入力すると、Service Portal は次の形式を使用します。

uid=scarter,OU=People,dc=example,dc=com
 

これで、ユーザと外部データソースがバインドされます。

Person Lookup イベント

Person Lookup のすべてのイベント(Order on Behalf、Service Form、Authorization Delegate)は同じ動作および設定オプションを使用します。

ディレクトリ統合イベントが有効になっていない場合、[Person Search] ウィンドウでは、Service Portal データベースの個人情報が検索されます。人が選択されると、その情報が使用されます。個人情報は更新されません。

ディレクトリ統合イベントが有効になっている場合、Person Lookup イベントは次の操作によって設定できます。

「Person Search」操作が最初の手順になっている必要があります。この操作は外部ディレクトリから個人情報を取得し、その情報を [Person Search] ウィンドウに表示します。人を選択すると、イベントに対して指定されているマッピングに従って、その人についての追加情報が取得され、コール側のコンテンツに提供されます。

「Import Person」操作がその次の手順です。この操作は、外部ディレクトリから選択した人のプロファイルを Service Portal にインポートし、データと同期します。

「Import Manager」の操作は、「Import Person」手順の次の操作です。この操作は、外部ディレクトリから、選択された人のマネージャに関する情報を取得し、その情報を使用して Service Portal データベースを更新します。

Person Search 操作

Person Search 操作の設定により、検索条件を満たす人を表示するウィンドウの外観および動作が決まります。

個人を Service Portal にインポートするためには、すべての必須フィールドが正しい属性マッピングを持ち、空白以外の値を返す必要があります。必須の値が 1 つでも指定されていない場合は、デフォルトで、検索結果から対象となる人が除外されます。代替の方法は、以下に示すように、対象となる人を検索結果に含めるが、情報が不完全であることをフラグで示すことです。

図 1-2 個人の検索

 

情報が不完全な人は選択できません。

Person Search 操作を設定する場合は、次のようにします。

設定
コメント

Search Selectivity

Show People with Incomplete Information

デフォルトでは、情報が不完全な人は [Search Results] ウィンドウから除外されます。

Sort By

First Name

Last Name First Name

First Name Last Name

Last Name

No Sort

デフォルトでは、Last Name でソートされます。

Max Results

デフォルトでは、検索結果に表示される行数は 1000 です。

*(アスタリスク)ワイルドカード文字と個人の検索

個人の検索を設定およびテストする場合には、ワイルドカード文字としてアスタリスク(*)の使用に注意が必要があります。

ユーザには表示されませんが、システムは検索文字列の末尾に必ず * を付加します。このため、[Last Name] フィールドに john と入力して [Search] をクリックすると、ディレクトリ内で姓が john で始まるすべての人(「John」、「Johnson」、「Johnston」など)が返されます。

[Search Person] ダイアログの検索文字列に、明示的に * の文字を入力することもできます。次に、ワイルドカード検索の使用例をいくつか示します。

[Last Name] フィールドに「*」を入力して [Search] をクリックします。ディレクトリ内のすべての個人が返されます。

[Last Name] フィールドに john* と入力して [Search] をクリックします。これは実質的に、[Last Name] フィールドに john とだけ入力したことと同じです。ディレクトリ内で、姓が「john」で始まるすべての個人が返されます。

[Last Name] フィールドに *john と入力して [Search] をクリックします。姓に「john」という語が含まれているすべての個人(「John」、「McJohn」、「Johnson」など)が返されます。

[Last Name] フィールドに *john*son と入力して [Search] をクリックします。姓に「john」という語が含まれ、それに続いて(直後でなくてもかまいません)「son」という語が含まれているすべての個人が返されます。具体的には、「Johnson」、「Mcjohnson」、「Upjohningson」などです。


) 検索文字列内では、* は常にワイルドカード文字として扱われます。このため、ユーザはディレクトリ内で * 文字が含まれている値を検索できません。その他のすべての特殊文字は、検索文字列で使用できます。


[Search Results] ウィンドウの設定

デフォルトでは、Select Person Popup の [Search Results] ウィンドウに個人の名と、その後に姓が表示されます。Administration モジュールで使用できる Setting for the Person Popup を変更して、ディスプレイにその他のフィールドを追加することもできます。

図 1-3 [Search Results] ウィンドウの設定

 

Import Person 操作

Import Person の設定は、アプリケーション内の個人情報が、(Person Search イベントで Import Person が使用された場合に)選択された個人に関する現在の情報で更新されるか、または(Login イベントで Import Person が使用された場合に)ログインしている個人に関する現在の情報で更新されるかを制御します。

設定
コメント

Refresh

Refresh Person Profile

Refresh Period (Hours)

インポートのたびに更新するには、更新期間を空白またはゼロにします。これにより、外部ディレクトリの最新の変更が常に Service Portal データベースに反映されます。また、最後に更新されてから指定期間が経過したときだけ、ユーザのプロファイルを更新するように指定することもできます。

Create Associations

Do Not Create Organizational Unit

Do Not Create Group

デフォルトでは、組織単位およびグループが作成されます(存在しない場合)。ロールはディレクトリ統合では作成できません。ロールは、個人をインポートする前に存在している必要があります。

Remove Existing Associations

Organizational Unit

Group

Role

デフォルトでは、既存の組織単位、グループ、またはロールの関連付けは削除しません。

Import Manager 操作

Service Portal では、承認と確認を動的に割り当てることができます。たとえば、要求のドル値が指定されたしきい値を超えている場合、特定の部署の部長による承認が必要な場合があります。別の要求では、要求者の直属の上司による確認が必要な場合があります。

このようなビジネス ルールを実装するには、サービスを要求できる従業員のマネージャも、Service Portal データベース内に登録されている必要があります。Import Manager 操作は、従業員のデータとあわせてマネージャ(上司)のデータをインポートすることで、この要件をサポートします。

Import Manager 操作の動作を管理するには、次の方法があります。

従業員のディレクトリ エントリで、その従業員のマネージャを指定する属性を特定します。

すべての従業員について、指定された属性に、マネージャを一意に特定する値が挿入されていることを確認します。これは通常、ログイン ID または電子メール アドレスにします。

(Optional Person Data Mappings にリストされている)[Supervisor] フィールドのマッピングで、マネージャの情報を保持している従業員データの属性を指定します。次のサンプルでは、managerEmail 属性を使用しています。

 

Import Manager 設定では、「Key Field for Manager ID」として、マネージャのディレクトリ レコードのフィールドを指定します。これらの値は、元の従業員に対して指定されている Supervisor 属性に対応しています。

考えられるシナリオとして、各個人のディレクトリ レコードに 1 つの属性が存在し、それが個人の上司を一意に特定する、というものがあります。たとえば、従業員のディレクトリ レコードの属性 manager_email にマネージャの電子メール ID が含まれていると仮定します。マネージャの他の情報は指定しません。

ソリューション

Supervisor

manager_email

Key Field for Manager ID

email(マネージャのディレクトリ レコード内の電子メール属性)

別のシナリオとして、ディレクトリ レコードに、従業員の上司の DN そのものである属性が含まれている、というものがあります。この属性の名前が manager とします。

ソリューション

Supervisor

manager

Key Field for Manager ID

dn(DN は特別な属性で、検索文字列の前にプレフィックスがつきません)

監視階層の利用も必要になることがあります。

たとえば、次の組織図について考えてみましょう。

 

1

レベル 1

3

レベル 3

2

レベル 2

4

レベル 4

直属の上司の承認を得なければならない要求の場合、ツリーの 1 つ上のレベルに上がる、「相対的な」検索が必要です。

または、特定の要求で部長の承認が必要、といった場合には、「絶対的な」検索が必要です。現在の個人の地位が「部長」になるまで、人(マネージャ)がインポートされます。Samantha Edgar の場合には、彼女の直属の上司 Harris Smith と、その人の上司で部長の Elizabeth Getty という、さらに 2 人が必要です。John Cullen の場合は、インポートが必要なのは 1 人です。

絶対検索(対象のレベル以上の権限を持つすべてのマネージャを、特定の地位の人が見つかるまでインポートする方法)を使用している場合は、地位に対して対応する数値を割り当てる必要があります。

社内階層を分析し、すべての管理職に対応する数値を割り当てます。

従業員のディレクトリ エントリで、その従業員の管理レベルを指定する属性を特定します。たとえば、「paygrade」という属性を使用できます。

すべての従業員について、指定された属性に値が入っていることを確認します。

(Optional Person Data Mappings にリストされている)[Management Lefel] フィールドのマッピングで、この情報を保持する属性を指定します。

Import Manager の設定で、最も高いレベルのマネージャを「Maximum Level」としてインポートするよう入力します。

既知の値よりも上位の上司と同期しない場合は、検索の終わりを設定することができます。#value1#, #value2# などの形式で複数の値を指定できます。

たとえば、uid が「scarter」の人よりも上位の上司はすべてインポートしないとします。その場合は、その人の Supervisor 属性がその人の電子メール(scarter@email.com)にマッピングされます。このケースでは、Search Terminator を #scarter@email.com# に設定します。ディレクトリ統合は、scarter@email.com で上司としてレコードが見つかるとすぐに、上司の同期を停止します。

制約条件が Maximum Level または Search Terminator のいずれかを満たすとすぐに、上司の同期は停止します。

 

設定
コメント

Key Field for Manager ID

従業員のマネージャ(上司)を一意に識別するディレクトリ属性。

Maximum Level

絶対検索の場合は、対象の従業員より上位にいるマネージャで、インポートする必要がある人の数を示します。相対検索の場合は、インポートするマネージャの最上位の管理レベルを示します。

Search Mode

Absolute

Relative

Search Terminator

マネージャのキー フィールドと一致しすると、検索を終了する 1 つ以上の値。

Refresh options

Refresh Person Profile

Refresh Period (Hours)

[Refresh Person Profile] チェック ボックスをオンにし、更新する Request Center 内のマネージャのプロファイルを示します。[Refresh Period] を空白のままにすると、同じ人に対して Import Manager イベントが発生するたびにプロファイルが更新されます。数値を指定すると、指定された期間内で 1 回だけマネージャのプロファイルが更新されます。

Associations

Do Not Create Organizational Unit

Do Not Create Group

Import Person の設定と同じです。

Remove Existing Association

Organizational Unit

Group

Role

Import Person の設定と同じです。

カスタム コード操作

カスタム コード操作を使用して、アプリケーションでサポートされていないルーチンを呼び出します。カスタム コード操作は、Service Portal の操作を置き換えたり、補完したりできます。

設定
コメント

Custom Code Operation Type

Single Sign-On

External Authentication

Import Person

Import Manager

Custom Code

Person Search

Java クラスを使用してマッピングの名前を指定します。Java クラスの詳細については、このマニュアルの「ディレクトリ統合と API」の章を参照してください。

ディレクトリ統合の設定

ディレクトリ統合の設定では、Administration モジュールの Directories オプションを使用します。基本的なプロセスは次のとおりです。

ディレクトリ統合を有効にします 。[Administration module's Settings] タブで [Directory Integration] オプション ボタンをクリックして、ディレクトリ統合を有効にします。

データソース情報を設定します 。[Administration module's Directories] タブの [Datasources] 領域を使用して、ディレクトリ サーバに接続するデータソースを設定します。データソース名、説明、プロトコル、サーバ製品、認証方法などの情報が必要です。

マッピングを設定します 。[Administration module's Directories] タブの [Mappings] 領域を使用して、アプリケーション データをディレクトリ サーバ データにマップします。マッピングは、ユーザ/個人のプロファイル全体、およびそれに関連するすべてのエンティティ(住所、連絡先、場所、1 つ以上のグループ関係、1 つ以上の組織単位(OU)関係、1 つ以上のロール関係)を更新します。

イベントを設定します 。[Administration module's Directories] タブの [Events] 領域を使用して、ディレクトリ統合の動作を設定します。Single Sign-On(SSO)、End User Authentication(EUA)、Import Person、Import Manager、Person Search などの操作を含めるよう、Login イベントと Person Lookup イベントを設定できます。

必要な場合は、クライアントのカスタマイズ(ディレクトリ Java クラス属性のマッピング、ディレクトリ サーバ API、個人のインポート、および関連エンティティ)に対して カスタム コード インターフェイスを設定します

ディレクトリ統合の有効化

ディレクトリ統合を有効化するには、次の手順に従います。


ステップ 1 管理権限を持つアカウントを使用してログインし、[Administration] モジュールを選択します。

ステップ 2 [Settings] タブをクリックします。

ステップ 3 [Directory Integration] の横にある [On] オプション ボタンを選択します。

ステップ 4 [Customizations] 画面の下部にある [Update] をクリックします。

これでディレクトリ統合が有効になりました(図 1-4 を参照してください)。


 

図 1-4 ディレクトリ統合の有効化

 

1

[Administration] モジュール

3

ディレクトリ統合の設定

2

[Settings] タブ

ディレクトリ統合の設定

Administration モジュールの [Directories] タブを使用して、ディレクトリ統合の多数の設定を行います。

図 1-5 [Directory Integration] 領域

 

1

[Administration] モジュール

2

[Directories] タブ


ステップ 1 管理権限を持つアカウントを使用してログインします。

ステップ 2 ドロップダウン メニューから [Administration] を選択します。

ステップ 3 [Directories] タブを選択します。

[Directory Integration] ページが表示されます。これらの設定は、ディレクトリ統合が有効になったときに反映されます。


 

データソース情報の設定

以降の項では、データソース特有の情報設定について解説します。タスクには次のものがあります。

データソースの追加または編集 :まだデータソースがない新しいインストールに対して、データソースを追加する必要があります。データソースが存在する場合は、それを編集できます。

SSL 接続に対するサーバ証明書の追加 :接続メカニズムとして SSL を選択した場合のみ、これを行う必要があります。

照会用のデータソースの追加 :必要な場合のみ実行します。

接続のテスト :接続を検証するために、接続は必ずテストする必要があります。

データソースの追加または編集

少なくとも 1 つのデータソースを定義する必要があります。新しいデータソースを追加するには、次の手順に従います。

図 1-6 データソースの追加または編集

 

1

[Datasources] オプション

3

[Edit Datasource] ボタン

2

[Add Datasource] ボタン

4

[Update] ボタン


ステップ 1 [Administration] モジュールを選択して [Directories] タブをクリックし、[Directory Integration] ページに移動します。

ステップ 2 まだ選択していない場合は、ページ ナビゲータで [Datasources] オプションをクリックします。

ステップ 3 [Add] をクリックします。新しいデータソースを追加する代わりに既存のデータソースを編集するには、リスト内で対象のデータソースの横にある [Edit] ボタンをクリックします。

[Datasource Configuration] 領域が展開されます。

ステップ 4 [Datasource Name]、[Datasource Description]、および必要な設定を入力します。隣接する領域のすべての設定にアクセスするには、 ボタンをクリックします。これらの設定の詳細については、データソースのワークシート、または以降の項を参照してください。

ステップ 5 [Update] をクリックします。


 

接続情報の設定

データソースへの接続で使用する接続プロトコル、およびユーザのクレデンシャルを指定します。

図 1-7 接続情報の設定

 

証明書の設定

接続メカニズムとして SSL を選択した場合は、ディレクトリ統合システムに対して証明書を指定する必要があります。

図 1-8 セキュリティ証明書の設定

 

1

[Add certificate] ボタン

3

[Certificate Type] ドロップダウン メニュー

2

[Certificate Name] フィールド

4

[Certificate Value] フィールド


ステップ 1 Administration モジュールの [Directories] タブをクリックして、[Directory Integration] ページに移動します。

ステップ 2 まだ選択していない場合は、ページ ナビゲータで [Datasources] オプションをクリックします。

ステップ 3 証明書を追加するデータソースの横にある [Edit] ボタンをクリックします。

ステップ 4 [Add Certificate] をクリックします。

ステップ 5 証明書に名前を付けます。証明書のエイリアス名には、スペースや特殊文字を使用しないでください。

ステップ 6 [Certificate Type] ドロップダウン メニューから証明書のタイプを選択します。

ステップ 7 証明書の値(VeriSign などのベンダーから入手したもの)を、証明書のフィールドに貼り付けます。

ステップ 8 [Update] をクリックします。


 

照会用データソースの設定

複数のデータソースを設定した場合は、選択したデータソースに対して、照会用システムとしてデータソースを指定することができます。この方法では、選択されたデータソースに対してシステムが検索を実行するたびに、照会用のすべてのデータソースも検索されます。

照会用のデータソースは、一致するものが見つかるまで、指定された順序で検索されます。検索条件で 1 つ以上のレコードが返されたときに、一致が見つかったことになります。

照会用のデータソースは通常、ディレクトリ情報が複数のディレクトリ間に分散している場合に使用します。たとえば、企業の複数の事業部で、それぞれ独自のディレクトリを保持することができます。

図 1-9 照会用データソースの設定

 

1

[Add Referral] ボタン

3

[Mapping Name] ドロップダウン メニュー

2

[Datasource Name] ドロップダウン メニュー


ステップ 1 Administration モジュールの [Directory Integration] ページに移動します。

ステップ 2 まだ選択していない場合は、ページ ナビゲータで [Datasources] オプションをクリックします。

ステップ 3 照会用データソースを設定するデータソースの横にある [Edit] ボタンをクリックします。

ステップ 4 [Add Referral] をクリックします。

ステップ 5 [Referral Datasource] 領域が表示されます。[Datasource Name] ドロップダウン メニューからデータソースを選択し、[Mapping Name] ドロップダウン メニューからマッピング名を選択します。

ステップ 6 [Update] をクリックします。


 

接続のテスト

必要な設定手順をすべて完了すると、次はディレクトリ統合の接続をテストできます。

図 1-10 接続のテスト

 

1

[Test Connection] ボタン

2

[Test Status] カラム


ステップ 1 Administration モジュールの [Directory Integration] ページに移動します。

ステップ 2 まだ選択していない場合は、ページ ナビゲータで [Datasources] オプションをクリックします。

ステップ 3 データソース名の左にあるチェックボックスをクリックして、テストするデータソースを選択します。

ステップ 4 [Test Connection] をクリックします。

接続が成功した場合は [Test Status] カラムに OK と表示され、接続が失敗した場合は が表示されます。


 

マッピングの設定

Administration モジュールの [Directories] タブで [Mappings] 領域を使用して、Service Portal データをディレクトリ サーバ データにマップします。

マッピングを設定するには、図 1-11 を参照し、次の手順に従います。

図 1-11 マッピングの設定

 

1

Mappings オプション

3

[Edit Mapping] ボタン

2

[Add Mapping] ボタン

4

[Update] ボタン


ステップ 1 Administration モジュールの [Directory Integration] ページに移動します。

ステップ 2 ページ ナビゲータの [Mappings] オプションをクリックします。

ステップ 3 [Add] をクリックして新しいマッピングを追加するか、リスト内で対象のマッピングの横にある[Edit] ボタンをクリックして既存のマッピングを編集します。

[Mapping Configuration] 領域が展開されます。

ステップ 4 マッピング ワークシートに記載されている要件に基づいて、マッピングの名前、説明、および属性を設定します。[Person Data] セクションに表示された、先頭にアスタリスク(*)が付いているマッピングは必須です。 ボタンをクリックしてオプションのマッピングを設定し、[Optional Person Data Mappings] セクションを展開することもできます。

ステップ 5 [Update] をクリックします。


 

次で説明するように、マッピング フィールドには簡易、複合、式、および Java の各マッピング タイプを指定できます。

マッピング タイプ

ここでは、指定可能なマッピング タイプについて説明し、正しいサンプルのマッピングを示します。また、式マッピングの例についても説明します。

次の表に、サポートされているマッピング タイプを示します。

 

表 1-1 マッピング タイプ

マッピング タイプ
説明

Simple

1 つのディレクトリ属性をフィールドにマップします。これは単純な 1 対 1 マッピングです。次に例を示します。

Person Field: First Name

Directory Attribute: givenName

Composite

属性の組み合わせをフィールドにマップします。# を使用して各属性名を区切ります。マッピングにはリテラルを含めることができます。次に例を示します。

Person Field: Email

Directory Attributes: #givenName#_#sn#@#domain#.com

Expression

式では、正規表現とパターン マッチングを使用してマッピングが得られます。詳細については、「式マッピング」を参照してください。

Java Class

簡易、複合、または式の各マッピングで目的とする機能を提供できない場合は、Java マッピングを使用します。これには、Java クラスを記述し、アプリケーション サーバ上の適切なディレクトリに、コンパイルしたクラス ファイルを配置する、という作業が含まれます。詳細については、「Java クラス マッピング」を参照してください。

簡易マッピングと複合マッピング

次の表は、必須フィールドに対する簡易マッピングと複合マッピングの例を示しています。

 

表 1-2 マッピングの例

個人データ
ディレクトリの値

First Name

givenName

Last Name

sn

Login ID

uid

Person Identification

uid

Email Address

#givenName#_#sn#@#company#.com

Home Organizational Unit

Ou

Password

Uid

マッピング

式マッピングを使用すると、式が一致するパターン(正規表現)基づいて、値を条件付きで属性に割り当てることができます。システムの式マッピングは Perl5 Regular Expression Language を使用し、Java の条件演算子に似た構文と組み合わせて、一致させるパターンを指定します。

構文

 
expr:<expression>=(<patternlist>)?(<valuelist>):<default>
 
 

ここで、

expr

式マッピングが使用されることを示すためのプレフィックスです。

<expression>

一致させるための式です。

<patternlist>

パイプ(|)で区切られたパターンのセットです。

<valuelist>

パターンのセットに対応する、パイプ(|)で区切られた値のセットです。それぞれの値は、式が対応するパターンと一致した場合の戻り値を指定します。

<default>

<patternlist> のパターンが <expression> と一致しなかった場合に使用される戻り値です。

次に例を示します。

expr:<expression>=
(<pattern1>|<pattern2>...<pattern
n>)?(<value1> | <value2> <valuen>):<default>
 

<expression> が <pattern1> に一致すると、<value1> を返します。

<expression> が <pattern2> に一致すると、<value2> を返します。

<expression> がどのパターンにも一致しない場合、<default> を返します。

各要素(expression、pattern、または value)には、# 記号で区切って、ディレクトリの属性名を含めることができます。たとえば、パターンを「#givenName#_#sn#」のように指定できます。ここで #givenName# と #sn# はどちらも属性名です。

また、括弧を使用して一連のパターン要素を 1 つの要素にグループ化できます。括弧内のパターンと一致した場合、$1、$2 などの形式で後方参照を使用して、以前に一致したパターンを参照することができます。

式データ マッピングの例

ディレクトリ統合に適用される式の簡単な利用法として、ディレクトリ内でコード化されている 1 つ以上の値を、よりわかりやすい記述、または広範なカテゴリに変換することができます。たとえば、サービスによっては、従業員と請負業者の区別が必要になることがあります。costCenter 属性は、「000000」が請負業者用です。したがって、[Employee Type] フィールドに次の式を適用することができます。

expr:#costCenter#=(000000)?(Contractor):Employee

もうひとつ、式の簡単な利用法として、ソース属性が空白の場合に、フィールドにデフォルト値を入力することができます。これは多くの場合に、ディレクトリ データが標準化できるまでの「応急処置」となります。また、たとえば外部の請負業者に部門が割り当てられない場合などの標準にすることができます。次の式を [Home OU] フィールド(マッピングの必須フィールド)に適用することができます。

expr:#DeptLevel2#=(.+)?(#DeptLevel2#):Contractors

この式では、該当する場合に DeptLevel2 属性を使用することも、ユーザの Home OU に対して事業部門のデフォルトを「Unknown」にすることもできます。

同様に、この式を使用して、一連の入力値を、異なる戻り値のセットに変換できます。これは、case 文、またはネストされた if/then 構造と同じです。たとえば、次の式を [Locale ID] フィールドに適用し、ユーザのロケーションに基づいて、そのユーザに言語を割り当てることができます。

expr:#country#=(United States | Germany)?(en_US | de_DE):en_US
 

ユーザの国が United States の場合は、言語を米国英語に設定し、ドイツの場合は言語をドイツ語に設定します。その他の国の場合は、言語を米国英語に設定します。

正規表現では、ソース属性の長さ、および英数字で構成されているかどうかをチェックできます。たとえば、郵便番号が数値データ タイプとして格納され、先行ゼロが切り捨てられることがあります。先行ゼロを回復するには、[Company Postal Code] フィールドに次のような式を適用できます。

expr:#postalCode#=(^[1-9][0-9][0-9][0-9]$)?(0#postalCode#):#postalCode#
 

postalCode 属性がちょうど 4 桁の場合は、属性に先行ゼロの値を追加します。これにより、郵便番号 1701 01701 に変換され、特定のパターンに一致しないすべてのソース値は、変更されずにそのままになります。

正規表現の同様の使用法として、属性値の形式が、予想したパターンと一致するかをチェックする、というものがあります。有効なマネージャのユーザ ID は、必ず 2 文字と、それに続く一連の数字で構成されている場合について考えてみましょう。たとえば、有効な ID は fd1024 や ID3839 となります。次の式を使用できます。

expr:#manager#=(cn=([a-zA-Z][a-zA-Z][0-9]+),.*)?($1):None

式、パターン、または戻り値で属性を使用できます。

expr:#sn#, #givenname#=(Smith.*|Doe, John)?(All Smiths|Only John):Others
 
expr:#sn#, #givenname#=(Smith.*|Doe, John)?(#givenname#|Only John):Others
 

パターンと照合するためにあらゆる試行を作成する前に、Doe、Jane などのディレクトリ レコードの姓および名が 1 つの文字列に組み合わされます。

パターンの一部を抽出するには、括弧および後方参照を組み込むと役立ちます。たとえば個人が所属している組織は、識別名(dn)属性内に組み込まれることがよくあります。

dn: cn=plee,ou=Corporate,dc=InfoSys,dc=com
 

[Home Organizational Unit] フィールドにマップされる式は、次のような形式になります。

expr:#dn#=((cn=[^,]+,ou=([a-zA-Z]+),dc=InfoSys,dc=com)?($1):Default
 

戻り値「Corporate」は後方参照値 $1 で、これは最初の括弧 ([a-zA-Z]+) 内の式で照合したパターンに相当します。

複数のフィールドが含まれているオーバーロード属性を解析するために、後方参照変数の使用が必要になることがあります。たとえば、1 つの属性に、個人の勤務先住所(ビル名、階数(レベル)、オフィスなど)を含めることが可能です。

location=Corporate Headquarters-Fifth Floor-Office #5F
 

異なる後方参照変数を、次の値として使用すると、同じパターンを使用して、式内で 3 つの要素を照合することができます。

Office Building

expr:#Location#=(([^-])+-([^-])+-(.*))?($1): Unknown

Building Level

expr:#Location#=(([^-])+-([^-])+-(.*))?($2): Unknown

Cubic Location

expr:#Location#=(([^-])+-([^-])+-(.*))?($3): Unknown

Java クラス マッピング

ディレクトリ データをフィールドにマップするためのカスタム Java クラスを実装するには、Java プログラミングをよく理解し、Java 開発環境が用意されている必要があります。

すべてのカスタム マッピング クラスは、「ディレクトリ統合でのカスタム コードの使用」のガイドラインに従っています。マッピング クラスは IEUIAttributeMapping インターフェイスを実装する必要があります。

開発者は以下のガイドラインに従って、カスタム コード モジュールをテストおよびインストールする必要があります。

1. 最適な Java IDE をインストールし、カスタム マッピング コードを開発するためのプロジェクトをセットアップします。

2. 要件を満たすようにカスタム コード ファイルを編集します。

3. コンパイルします。

4. カスタム Java クラスは、Request Center サービスがアクセスできるように、Service Portal の Web アーカイブ(war)にインストールする必要があります。RequestCenter.war/WEB-INF/classes にディレクトリを作成し、パッケージと一致するようにします。このようなディレクトリは通常、次のような名前になります。

com/newscale/client/<clientname>(com/newscale/client/aib など)。

5. CustomMapping.class ファイルを、前の手順で作成したディレクトリにコピーします。

6. Request Center サービスを再起動します。

7. クラス ファイルの完全修飾名を Mapped Attribute として指定し、フィールドに値が挿入されるようにします。

8. ディレクトリ テスト機能を使用して、カスタム コードをテストします。

9. ソースを適切なリポジトリに保存します。

マッピングのテスト

マッピング テスト機能を使用して、自身のデータ マッピングが正しく設定されていること、およびディレクトリ サーバから正しい値を取得することをテストします。

データ マッピング テスト機能の使用には、次の処理が含まれます。

データ マッピング テスト機能を有効にする

データ マッピング テスト コントロールを使用する

ディレクトリ マップ テスト機能の有効化

ディレクトリ マップのテスト機能を有効にするには、図 1-12 を参照し、次の手順に従ってください。

図 1-12 マッピング テストの有効化

 

1

[Debugging] オプション

3

[Update] ボタン

2

ディレクトリ マップ テストの設定


ステップ 1 Administration モジュールの [Settings] タブをクリックして [Settings] ページを表示します。

ステップ 2 ページ ナビゲータの [Debugging] オプションをクリックします。

[Debug Settings] ページが表示されます。

ステップ 3 [Directory Map Testing] 設定の横にある [On] オプション ボタンをクリックします。

ステップ 4 [Update] をクリックします。

データ マッピング テスト機能が有効になります。[Data Mapping] タブにアクセスすると、図 1-13 に示すように、次の追加機能が表示されます。

[Choose a Datasource for Testing] ドロップダウン メニュー

[Fetch] ボタン

[Clear] ボタン

[Test Values] カラム


 

データ マッピング テスト コントロールの使用

図 1-13 マッピング テスト コントロール

 

1

[Mappings] オプション

4

[Fetch] ボタン

2

[Edit] ボタン

5

[Test Values] カラム

3

[Choose a Datasource for testing] ドロップダウン メニュー

6

[Test summary] 領域

データ マッピング テスト コントロールの使用方法


ステップ 1 [Mapping] ページが表示されていない場合は、[Mappings] をクリックします。

ステップ 2 テストするマッピングの横にある [Edit] をクリックします。

ステップ 3 [Choose a Datasource for testing] ドロップダウン メニューから対象のデータソースを選択します。

ステップ 4 [Test Values] カラムにテスト値を入力します。簡易、複合、Java、および式の各マッピングを使用できます。

ステップ 5 [Fetch] をクリックします。

ステップ 6 [Test Values] カラムにテスト値が表示され、ページの下部に結果の概要が示されます。


) [Fetch] により値が返されるのは 1 つのデータソースのみで、照会先は検索されません。照会先の検索が統合されているとデバッグが難しいため、便宜上そのようになっています。


ステップ 7 [Fetch] ボタンの右にある [Clear] をクリックして、希望するマッピングが設定されるまで、新しい値をさらに試します。


 

ディレクトリ統合イベントの設定

Administration モジュールの [Directories] タブで [Events] 領域を使用して、次のイベントに対するディレクトリ統合の動作を設定します。

Login

Person Lookup for Order on Behalf

Person Lookup for Service Form

Person Lookup for Authorization Delegate

イベントを設定するには、図 1-14 を参照し、次の手順に従います。


ステップ 1 Administration モジュールの [Directory Integration] ページに移動します。

ステップ 2 ページ ナビゲータの [Events] をクリックし、[Events] ページを表示します。

ステップ 3 設定するイベントのタイプの横にある [Edit] をクリックします。

[Event Configuration] 領域が表示されます。

ステップ 4 [Event Status] ドロップダウン メニューから [Enabled] を選択し、イベントを有効にします。

ステップ 5 [Add step] をクリックして手順を追加し、選択したイベントが発生したときにシステムで開始されるようにします。

ステップ 6 追加した手順に関連付ける操作を選択します。

SSO や EUA など、いくつかの操作は一部のイベント タイプに適用できませんが、このメニューではすべての操作を使用できます。

ステップ 7 [Options] をクリックして、選択した操作に関連付けるオプションを設定します。[Options] 領域が表示されます。[Options] 領域は、選択した操作によって異なります。使用できる操作、およびその操作のオプションについては、次の項で詳しく説明します。

ステップ 8 関連付けるオプションを設定します。使用できる操作、および操作を設定するためのオプションの説明については、ディレクトリ Events に関するこのマニュアルの項を参照してください。

ステップ 9 [Update] をクリックし、追加する各手順および操作に対して、これらの手順を繰り返します


 

図 1-14 イベントの設定

 

1

[Events] オプション

5

[Operation] ドロップダウン メニュー

2

[Edit] ボタン

6

[Options] ボタン

3

[Event Status] ドロップダウン メニュー

7

[Update] ボタン

4

[Add step] ボタン

ディレクトリ統合でのカスタム コードの使用

ディレクトリ統合フレームワークは、「Login」および「Person Lookup」イベントの柔軟性を利用し、カスタマイズできるよう設計されています。

Administration モジュールの [Directories] タブでは、すべてのイベントに対する標準操作を使用できます。そのような標準の操作としては、SSO、External User Authentication、Import Person、Import Manager、および Person Search などがあります。

これらの標準操作ではビジネス シナリオを満たせない場合、[Directories] タブには、カスタム Java コードを実行するためのインターフェイスも用意されています。このカスタム コードは、このドキュメントに記載されたインターフェイスに準拠している必要があり、Service Portal が公開している API を使用して、すべてのカスタマイズ ソリューションを開発する必要があります。

以下に、イベントの操作をカスタマイズできるシナリオの有効な使用例を示します。

状況
対策

HttpServletRequest による SSO ヘッダー入力の形式を解析できない

ベンダーと SSO との統合をサポートするために、ユーザのクレデンシャルを取得するカスタム コード SSO 操作を提供する。

Service Portal 以外の Web サービスまたはデータベースでユーザを認証する

カスタム コード External Authentication 操作を提供する。

会社のメイン ユーザ リポジトリが、LDAP ディレクトリ以外のデータベースにある

カスタム コード External Authentication、およびカスタム コード Import Person 操作を提供する。

ディレクトリ統合カスタム コード フレームワークでは、外部データソースのレコードから個人またはユーザ プロファイルの特定のフィールドに対する、複雑な取得ロジックを提供するよう実装可能なインターフェイスも定義されます。

ディレクトリ統合の Public API およびインターフェイスには次のものが含まれています。

カスタム コード操作インターフェイス 。ディレクトリ統合の操作をカスタマイズするために使用します。

カスタム Java クラス マッピング インターフェイス 。レコードから外部データソースの特定の属性を取得する場合に、カスタマイズされた取得を提供します。

ディレクトリ サーバ API 。外部データソースで照会または認証を行い、レコードを取得するために使用します。

個人のインポート/更新 API 。Service Portal データベースの個人属性を更新するために使用します。

一般的なカスタム コード プロジェクトには、次のタイプのアクティビティが含まれています。

カスタム コードの必要性を確認する。

Administration モジュールの [Directories] タブを設定して、カスタム コードで使用されるデータソースを含める。該当する場合は、カスタム コードで使用する可能性のあるマッピングを含める。

カスタム コードを開発する。公開 API、およびディレクトリ統合タスク用にシスコから提供されたインターフェイスについて理解する必要があります。

カスタム コードをビルドおよび導入する。

カスタム コードを使用するよう、Administration モジュールの [Directories] タブを設定する。

次の表に、ディレクトリ統合の操作を詳しく示します。

 

表 1-3 ディレクトリ統合の操作

操作
目的
入力
出力

Single Sign-On

ユーザのログイン名を識別する

HttpServletRequest

ログイン名

External Authentication

外部データソースでユーザを認証する

ログイン名
パスワード

ユーザの認証

Person Search

名または姓が一致する個人のリストを取得する

名と姓

個人のリスト

Import Person

外部データソースから Service Portal データベースに個人をインポートする

ログイン名

インポートされた個人情報(managerID も含む)

Import Manager

外部データソースから Service Portal データベースに、マネージャまたはマネージャのチェーンをインポートする

インポートされた個人情報(マネージャ情報も含む)

マネージャがシステムにインポートされる

標準操作とカスタム コード操作の混在と照合、または置換も、ディレクトリ統合フレームワークでサポートされています。次の表に示すように、Service Portal は、1 つのイベントでさまざまな操作の組み合わせをサポートしています。独自にカスタマイズしたコードと、これらのインターフェイスを実装しやすくするよう設計された、Service Portal の公開 API を使用できます。

カスタム コードの設計および開発エンジニアは、ディレクトリ統合フレームワーク、公開 API、およびカスタム コード インターフェイスについて理解することが重要です。これらについては、このガイドで詳しく説明します。

次の表は、カスタム コード操作のメソッド、イベント、および操作タイプ間の関係を表しています。次の表に記載されていない組み合わせはサポートされていません。

 

表 1-4 カスタム コード操作

イベント
オペレーション タイプ
インターフェイス
メソッド

Login

SSO

ISignOn

getCredentials

EUA

ISignOn

authenticate

Import Person

ISignOn

importPerson

Import Manager

ISignOn

importManager

Custom Code

ISignOn

performCustom

Person Search for:

Order On Behalf

Authorization Delegate

Service Form

Person Search

IPersonSearch

getCredentials

Import Person

IPersonSearch

importPerson

Import Manager

IPersonSearch

importManager

Custom Code

IPersonSearch

performCustom

カスタム コード操作インターフェイス

イベント内で設定されている操作のカスタム実装を提供する場合、カスタム コード操作インターフェイスを実装する必要があります。

カスタム コード操作インターフェイスは、特定の操作がトリガーされたときに呼び出されるコールバック メソッドを定義します。どのメソッドが呼び出されるかは、操作で選択された操作タイプによって決まります。詳細については、カスタム コード操作のメソッド、イベント、およびタイプの表を参照してください。カスタム コードの操作インターフェイスで定義されるすべてのメソッドは、同じパターンに従っています。

パラメータ

以下のリストで、「**」は次のいずれかの操作タイプで置き換える必要があります。

IEUISignon

IEUIPersonSearch

1. **OperationDTO:このオブジェクトには、Administration モジュールの [Directories] タブで操作をどのように設定したか、についての情報が含まれています。これには、マッピングおよびデータソースの情報が含まれます。

2. **OperationContext:Context オブジェクトを使用して、メソッドの呼び出しで情報を共有します。ディレクトリ統合フレームワークは、1 つのコンテキスト オブジェクトに情報を格納しますが、これは同じ HttpServletRequest の呼び出しのときに他のコンテキスト オブジェクトで使用することができます。

a. setLocalContextObject および getLocalContextObject を使用すると、結果の一部にはならないカスタム情報を設定できます。

b. get**Result を使用すると結果オブジェクトが取得されます。結果オブジェクトには、イベント要求全体で発生したことに関するすべての情報が含まれています。結果には、製品化されたインポートでサポートされている情報が含まれています。LocalContext オブジェクトを使用して、製品化された操作の実装で予期しなかったオブジェクトを格納します。

3. Request:HttpServletRequest です。

4. **ImportAPI:このオブジェクトを使用して個人をインポートします。詳細は、以降で説明します。

5. **LDAPAPI:この API を使用して LDAP クエリーを作成します。詳細は、以降で説明します。

戻り値

**Result。カスタム タスクを実行すると、API は、有効な戻りタイプに結果を挿入して返します。関連するプロパティを更新した後、OperationContext から取得される、同じ結果オブジェクトが返されます。結果オブジェクトの新しいインスタンスが返されると、予期しない動作が生じることがあります。

表 1-5 は、予想される入力または戻りと、各コールバック メソッドのパラメータにあるオブジェクトの関係を示しています。

 

表 1-5 カスタム コード コールバック メソッドの入力

情報
オブジェクト/プロパティ

HttpServletRequest

Request

ログイン名

IEUISignOnOperationContext .IEUISignOnOperationResult.ssoLoginId

IEUIPersonSearchOperationContext .IEUIPersonSearchOperationResult.ssoLoginId

First Name と LastName

First Name:IEUIPersonSearchOperationContext.firstNameSearchString

Last Name:IEUIPersonSearchOperationContext.lastNameSearchString

個人のリスト

IEUIPersonSearchOperationContext.EUIPersonSearchOperationResult.SearchPersonList.SearchPersonList is a collection with all elements of type IExtPersonDTO

インポートされた個人情報

IEUISignOnOperationContext .IEUISignOnOperationResult.ImportedPersonExtDTO

IEUIPersonSearchOperationContext.EUIPersonSearchOperationResult.ImportedPersonExtDTO

マネージャ ID

IEUIPersonSearchOperationContext.EUIPersonSearchOperationResult.ImportedPersonExtDTO.PersonDTO.managerID

実装クラスをコンパイルするには、すべてのメソッドを実装する必要があります。制限されている操作タイプのみをカスタマイズする場合、その操作タイプに関連しないメソッドの、空の実装を提供する必要があります。

たとえば、カスタマイズされた SSO のみを対象にする場合は、getCredentials メソッドの完全な実装を提供します。その他のすべてのメソッドについては、ヌルを返します。

システムはインターフェイスのインスタンスをプールできます。また、複数のスレッドから同時にアクセスすることができます。したがって、インスタンスはステートレスにしておくことを推奨します。

カスタム コードの操作インターフェイスには、次の 2 つのタイプがあります。

ISignOn はログインのカスタマイズで使用されます。

IPersonSearch は「Person Lookup」ダイアログのカスタマイズで使用されます。

Login イベント カスタム コード インターフェイス:ISignOn

これは、ログイン イベント SSO、EUA、Import Person、Import Manager、およびカスタム コード操作をカスタマイズするために、カスタム コードが実装する必要のあるインターフェイスです。

SSO 操作のカスタマイズ

SSO カスタム コード操作の主な目的は、Remote NTML/IWA のタイプが Sign-On の場合に、Sign-On、または CGI ヘッダー(CGI 変数 REMOTE_USER)からログイン名を取得し、返すことです。

表 1-4 に概要を示すように、ISignOn インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、getCredentials メソッドの完全な実装を提供してください。詳細な仕様については、ISignOn インターフェイスのマニュアルを参照してください。

以下に、getCredentials メソッドを実装するためのガイドラインを示します。これらのすべてのガイドラインを実装する必要はありません。以下の概説では取り上げていませんが、カスタマイズによっては追加の要件が存在する場合があります。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

パラメータ要求を使用して処理し、個人のログイン名が得られるようにします。

in-product ディレクトリのルックアップ機能を使用した場合は、IEUISignOnOperationResult.setSsoLoginId(<login id>) をコールすると LoginId が返されます。

IEUISignOnOperationResult.setSsoRedirectUrl("<any url or error page>") をコールします。これは、SSO の障害時にユーザをリダイレクトするために使用します。

IEUIEventSSOOperationDTO.getEventSsoDTO() で取得された SSO 操作のオプションはヌルになる可能性があります。カスタム コード操作に対しては、Administration モジュールが SSO オプションを受け入れないからです。

Login イベントに対する EUA 操作のカスタマイズ

EUA カスタム コード操作の主な目的は、外部システムに対してユーザを認証することです。

表 1-4 に概要を示すように、ISignOn インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、authenticate メソッドの完全な実装を提供してください。詳細な仕様については、ISignOn インターフェイスのマニュアルを参照してください。

以下に、EUA 操作を実装するためのガイドラインを示します。これらのすべてのガイドラインを実装する必要はありません。以下では取り上げていませんが、カスタマイズによっては追加の要件が存在する場合があります。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

IEUIEventEUAOperationDTO オブジェクトの EUIDatasourceDTO オブジェクトには、この操作に対して Administration モジュールで設定された Datasource へのインターフェイスが含まれています。

EUIUtil の LDAPConfigInfo オブジェクトに値を挿入し、EUIDatasourceDT に渡します。これは、LDAP Server に接続情報を使用して LDAP API をコールするために必要です。

IEUISignOnOperationResult.getSsoLoginId() をコールして Login Name を取得します。

BindDN を形成し、setBindDN() をコールして LDAPConfigInfo に設定します。

IEUISignOnOperationResult.getEuaPassword() をコールして、[Login] ページでユーザが入力したパスワードを取得します。

setBindPassword() をコールして、それを LDAPConfigInfo に設定します。

LDAPConfigInfo オブジェクト ILDAPApi.authenticate() API を渡して、Directory Server に対してユーザを認証します。

ユーザが認証されたら、IEUISignOnOperationResult.setEuaAuthenticated(true) をコールします。

ユーザの認証が失敗したか、何らかの例外が発生した場合は、IEUISignOnOperationResult.setEuaAuthenticated(false) をコールします。

IEUIEventEUAOperationDTO.getEventEuaDTO() で取得した EUA 操作オプションは空になります。カスタム コードの操作に対しては、Administration モジュールが EUA オプションを受け入れないからです。

Login イベントに対する Import Person 操作のカスタマイズ

Import Person 操作の主な目的は、外部システム(ディレクトリ サーバや外部データベースなど)から Service Portal アプリケーションにユーザをインポートまたは更新することです。

表 1-4 に概要を示すように、ISignOn インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、importPerson メソッドの完全な実装を提供してください。詳細な仕様については、ISignOn インターフェイスのマニュアルを参照してください。

以下に、Import Person 操作を実装するためのガイドラインを示します。これらのすべてのガイドラインを実装する必要はありません。以下では取り上げていませんが、カスタマイズによっては追加の要件が存在する場合があります。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

IEUIEventImportPersonOperationDTO オブジェクトの EUIDatasourceDTO オブジェクトには、この操作に対して Administration モジュールで設定されたデータソースへのインターフェイスが含まれています。

IEUIEventImportPersonOperationDTO オブジェクトの EUIDataMappingDTO オブジェクトには、この操作に対して Administration モジュールで設定されたマッピングへのインターフェイスが含まれています。

IEUISignOnOperationResult.getSsoLoginId() メソッドから取得したログイン名を使用して、LDAP サーバまたは外部データベースから外部システム上のユーザに対して問い合わせを行い、個人のプロファイルに関するすべての情報(組織単位、グループ、ロールなど)を収集します。

ISignOnImportPersonAPI.getPersonByLoginName(<Login Id>) をコールして、ユーザがすでに Service Portal データベースに存在しているかどうかチェックします。すでに存在している場合、このメソッドは IPersonDTO オブジェクトを返します。存在していない場合、メソッドは signOnImportPersonAPIException をスローします。

個人が見つからない場合は、個人のインポートを準備するために、PersonFactory.createPersonDTO() メソッドによって IPersonDTO オブジェクトを作成します。

外部システムからフェッチしたデータから、PersonFactory を使用してこれらの DTO を作成して値を挿入します。IPersonDTO、ILoginInfo、IContactDTO、IAddressDTO、および IPersonExtensionDTO についても同様にします。

ISignOnImportPersonAPI.beginTransaction() をコールしてデータベース トランザクションを開始します。

ISignOnImportPersonAPI.getOrgUnitByName(<OU Name>) をコールして、組織単位(OU)が存在するかどうかチェックします。存在する場合、このメソッドは IOrganizationalUnitDTO オブジェクトを返します。組織単位が存在しない場合、メソッドは signOnImportPersonAPIException をスローします。

OU が存在しない場合は、ISignOnImportPersonAPI.createOrgUnit(<IOrganizationalUnitDTO>) をコールして作成することができます。

ユーザがすでに存在する場合、ISignOnImportPersonAPI.updatePerson(<IPersonDTO>) をコールします。これにより、個人の基本プロファイル、ログイン情報、プリファレンス、ホーム OU、および内線番号が更新されます。

ユーザがすでに存在する場合は、ISignOnImportPersonAPI.linkAddresses(<IAddressDTO collection>) および ISignOnImportPersonAPI.linkContact(<IContactDTO> をコールして、住所/ロケーションおよび連絡先をリンクまたは更新します。

個人が外部システムの 1 つ以上のグループに関連付けられている場合は、ISignOnImportPersonAPI.getGroupByName (<ou name>) をコールして、最初に、存在するすべてのグループを取得します。関連付けられていない場合は、ISignOnImportPersonAPI.createGroup(<IOrganizationalUnitDTO>) をコールして新しいグループをすべて作成します。

個人が新規の場合は、ISignOnImportPersonAPI.linkPersonToOrgUnit() および ISignOnImportPersonAPI.linkPersonToGroup() をコールして、OU およびグループのすべてのリストをユーザにリンクします。

個人がすでに存在する場合は、ISignOnImportPersonAPI.unlinkPersonToOrgUnit() および ISignOnImportPersonAPI.unlinkPersonToGroup() をコールして、ユーザからすべての OU およびグループをリンク解除することができます。

OU の既存の関係(個人のホーム OU やグループなど)を見つけるには、ISignOnImportPersonAPI.getOrgUnitsForPerson() および ISignOnImportPersonAPI.getGroupsForPerson() methods をコールします。

ロールへの既存の関係を見つけるには、ISignOnImportPersonAPI.getRolesForPerson() method をコールします。

インポートされた個人をロールに関連付ける必要がある場合は、最初に ISignOnImportPersonAPI.getRBACRoleByLogicName(<roleLogicName>) を使用してロールを取得します。

ISignOnImportPersonAPI.linkPersonToRole() または ISignOnImportPersonAPI.unlinkPersonToRole() をコールして、個人にロールをリンクまたはリンク解除します。

個人のインポートまたは更新が正常に終了したら、IEUISignOnOperationResult にフラグ ImportPersonDone = true を設定します。

インポートまたは更新が正常に終了したら、PersonFactory.createExtUserDTO() で IExtUserDTO のオブジェクトを作成し、IPersonDTO および HomeOUDTO (IOrganizationalUnitDTO) を IExtUserDTO に設定し、IEUISignOnOperationResult.setImportedPersonExtDTO(<IExtUserDTO>) をコールして、インポートした個人の IExtUserDTO を返します。

インポートまたは更新操作が失敗したら、IEUISignOnOperationResult にフラグ ImportPersonDone = false を設定します。

ISignOnImportPersonAPI.commitTransaction() をコールしてデータベース トランザクションを終了またはコミットします。

トランザクションが失敗した場合は、ISignOnImportPersonAPI.rollbackTransaction() をコールして exception ブロックでトランザクションをロールバックし、ISignOnImportPersonAPI.releaseTransaction() をコールして finally ブロックでトランザクションをリリースします。

IEUIEventImportPersonOperationDTO.getImportPersonDTO() メソッドによる Import Person 操作のオプションは空です。カスタム コードの操作に対しては、Administration モジュールが Import Person オプションを受け入れないからです

Login イベントに対する Import Manager 操作のカスタマイズ

Import Manager 操作の主な目的は、ディレクトリ サーバなどの外部システムから、個人の上司チェーンを Service Portal にインポートまたは更新することです。

表 1-4 に概要を示すように、ISignOn インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、importPerson メソッドの完全な実装を提供してください。詳細な仕様については、ISignOn インターフェイスのマニュアルを参照してください。

以下に、Import Manager 操作のガイドラインを示します。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

IEUISignOnOperationResult から、インポートまたは更新されたユーザの ImportedPersonExtDTO を取得します。

IEUISignOnOperationResult.getImportedPersonExtDTO() method メソッドでインポートされた個人を取得します。IExtUserDTO オブジェクトが返され、それから PersonDTO オブジェクトを取得します。

外部システムから、必要に応じてすべてのマネージャをインポートし、前述の Import Person の例で説明しているのと同じ方法で、各マネージャを作成または更新します。

personDTO は、インポートされたマネージャの IPersonDTO への参照であり、managerDTO は、マネージャのインポート後に返された IPersonDTO への参照であることを前提に、マネージャを個人にリンクします。

personDTO.setManagerId(managerDTO.getId() を使用して、personDTO に対するマネージャの関係を設定します。

「Import Person 操作」に説明のあるいずれかのメカニズムを使用して personDTO を保存し、関係を保存します。

マネージャ チェーンをインポートする場合は、個人よりも先に最上位のマネージャをインポートすることを推奨します。これにより、personDTO が個人のマネージャとのリンクを更新するための不要な更新が防止されます。

IEUIEventImportManagerOperationDTO で取得した Manager 操作オプションをインポートします。getImportManagerDTO() は空になります。カスタム コードの操作に対しては、Administration モジュールが Import Manager オプションを受け入れないからです。

Login イベントに対するカスタム操作のカスタマイズ

カスタム コード操作の主な目的は、アプリケーションの他のどの場所にも示されていない、必要なカスタム操作を実行することです。

以下に、カスタム コード操作のガイドラインを示します。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

IEUIEventCustomOperationDTO から EUIDatasourceDTO を取得します。このオブジェクトには、この操作の Administration モジュールで設定されたデータソースが含まれています。

IEUIEventCustomOperationDTO から EUIDataMappingDTO を取得します。このオブジェクトには、この操作の Administration モジュールで設定されたマッピングが含まれています。

必要に応じて、すべてのカスタム操作を実行します。

前の例に基づいて、IEUISignOnOperationResult には値が適切に挿入されるはずです。

Person Lookup のカスタム コード インターフェイス:IPersonSearch

これは、Person Search イベントの Person Search、Import Person、Import Manager、およびカスタム コード操作をカスタマイズするために、カスタム コードが実装する必要のあるインターフェイスです。

実装クラスは、Administration モジュール > [Directories] タブ > [Events] で設定されます。Service Portal アプリケーション内の次の場所で個人を検索するために設定することができます。

Person Search for Order On Behalf

Person Search for Authorization Delegate

Person Search for Service Form

Person Search 操作のカスタマイズ

Person Search 操作の主な目的は、ディレクトリ サーバなどの外部システムからユーザを検索することです。

表 1-4 に概要を示すように、IPersonSearch インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、search メソッドの完全な実装を提供してください。詳細な仕様については、ISignOn インターフェイスのマニュアルを参照してください。

以下に、Person Search 操作のガイドラインを示します。

IEUISignOnOperationContext から IEUISignOnOperationResult を取得します。これは、このインターフェイスから必ず返されるオブジェクトです。

カスタム Person Search 操作は、Person Search を使用して設定できるため、Search Event の以前の操作から、検索結果に対して追加したり、操作したりできます。このようにするには、IEUISignOnOperationResult.getSearchPersonList() をコールして、すでに検索結果内に存在する個人のリストを取得します。

外部システムのユーザを検索します。ディレクトリ サーバの場合は、インターフェイス ILDAPApi で API メソッドを使用し、外部データベースの場合は、SQL データソースに接続するために ISignOnImportPersonAPI で API を使用します。

外部システムで見つかった個人ごとに IExtUserDTO を作成します。

IExtUserDTO に、IPersonDTO、IOrganizationalUnitDTO(ホーム OU の場合)、および ILoginInfoDTO を挿入します。

任意:個人のポップアップ グループ設定に基づいて、コレクション IContactDTO、IAddressDTO のコレクション、IPersonExtensionDTO にも挿入します。

ISignOnImportPersonAPI getCustomParam("ShowAllUsersForOrderOnBehalf") を使用して、フラグ「All Users For Order On Behalf」を取得します。

カスタム コードと標準プラットフォームの動作との整合性を保つため、フラグがオフで、個人に対していずれかの必須属性が指定されていない場合は、そのエントリを削除します。これにより、不完全な個人はポップアップに表示されなくなります。

カスタム コードと標準プラットフォームの動作との整合性を保つため、フラグがオンで、いずれかの必須属性に対して個人が指定されていない場合は、IExtUserDTO.setResultHasError(true) をコールします。これにより、不完全な個人がポップアップに含まれるようになりますが、オプション ボタンの代わりに赤いアスタリスク「 * 」が表示されます。星印の付いたユーザは、エンド ユーザが選択することも、インポートすることもできません。

IEUISignOnOperationResult. setSearchPersonList(<List of all IExtUserDTO>) をコールして、検索されたすべての個人のリストを返します。

IEUIEventPersonSearchOperationDTO.getPersonSearchOperationDTO() メソッドで取得した Person Search 操作のオプションは空です。これは、カスタム コードの操作に対しては、Administration モジュールが Person Search オプションを受け入れないからです。

Person Search イベントに対する Import Person 操作のカスタマイズ

表 1-4 に概要を示すように、IPersonSearch インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、importPerson メソッドの完全な実装を提供してください。詳細な仕様については、IPersonSearch インターフェイスのマニュアルを参照してください。

カスタマイズする手順は、「Login イベントに対する Import Person 操作のカスタマイズ」と同様です。

Person Search イベントに対する Import Manager 操作のカスタマイズ

表 1-4 に概要を示すように、IPersonSearch インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、search メソッドの完全な実装を提供してください。詳細な仕様については、IPersonSearch インターフェイスのマニュアルを参照してください。

カスタマイズする手順は、「Login イベントに対する Import Manager 操作のカスタマイズ」と同様です。

Person Search イベントに対するカスタム操作のカスタマイズ

表 1-4 に概要を示すように、IPersonSearch インターフェイスを実装する Java クラスを提供する必要があります。このインターフェイスでは、performCustom メソッドの完全な実装を提供してください。詳細な仕様については、IPersonSearch インターフェイスのマニュアルを参照してください。

カスタマイズする手順は、「Login イベントに対するカスタム操作のカスタマイズ」と同様です。

カスタム Java クラス マッピング インターフェイス

簡易、複合、または正規表現の各属性マッピングでは不十分な場合は、ディレクトリ統合属性マッピングでカスタム Java クラスを使用することができます。

属性マッピングに対するカスタム Java クラス:IEUIAttributeMapping

これは、ディレクトリ属性マッピングをカスタマイズするために、カスタム コードが実装する必要のあるインターフェイスです。カスタム マッピング クラスの主な目的は、ディレクトリ サーバから取得した属性値をカスタマイズすることです。

実装クラスは、Administration モジュール > [Directories] タブ > [Mappings] で設定され、マッピングのすべての属性に対して設定できます。

図 1-15 属性マッピングに対するカスタム Java クラス

 

以下に、カスタム Java クラスのマッピング クラスを使用するためのガイドラインを示します。

マッピング クラスは、ディレクトリから取得された値に適用される、簡単なロジックに対してのみ使用されます。

パフォーマンス上の理由から、Directory Server API を使用してディレクトリ サーバに対するコールを実行したり、何らかのデータベース操作を実行するためにマッピング クラスを使用することはできません。これらの用途に対しては、Person Search または Login インターフェイスを使用する必要があります。

マップされた属性に対して単一の値を返すには、IEUIAttributeMapping.getAttributeValue() を実装します。このメソッドは、OU List、Group List、または Role List mapping フィールドに対して実装しないでください。

マップされた属性に対して複数の値を返すには、IEUIAttributeMapping.getAttributeValueArray() を実装します。このメソッドは、OU List、Group List、および Role List マッピング フィールドに対してのみ実装されます。

Directory Server API

これは、製品に組み込まれているディレクトリ サーバ(LDAP)接続機能と統合するために、シスコが提供する API ラッパーです。

この API が提供する機能は、ディレクトリ サーバに対する認証、およびクエリーのみです。この API は、Service Portal でサポートされているすべてのディレクトリ サーバをサポートします。

通常、Directory Server API はディレクトリ統合のデータソースおよびマッピング設定から機能し、クエリー用の接続情報、フィルタ、および属性を手作業でコーディングする必要がありません。

一般的に、LDAP API を使用するには、LDAPConfigInfo オブジェクトも必要です。この目的のためには、すべてのデータソースおよびマッピングから EUIUtil.get LDAPConfigInfo() を使用します。

LDAP API の javadoc は、製品インストーラの Image フォルダにあります。

ILDAPApi のインスタンスの取得:API 実装

ILDAPApi のインスタンスを作成する必要はありません。両方のカスタム コード API インターフェイス(ISignOn と IPersonSearch)のすべてのメソッド引数で使用できます。

ディレクトリ統合ユーティリティ(EUIUtil)クラス

ディレクトリ統合ユーティリティクラス(EUIUtil)は、Administration モジュールで設定されたデータソースおよびマッピングを、Directory Server API が認証、検索、およびクエリー機能の入力として使用できる形式に変換します。

LDAP 設定情報(LDAPConfigInfo)クラス

LDAPConfigInfo クラスのオブジェクトは、ディレクトリ サーバ API に渡す必要がある、次のすべての設定オプションをカプセル化します。

認証情報

接続情報

クエリー属性

検索フィルタ

上級ユーザの場合は、何らかの設定を上書きする必要がある場合に、すべての設定に対する getter および setter が LDAPConfigInfo から提供されます。これらのメソッドの詳細については、このクラスに関する Javadoc を参照してください。

API のメイン インターフェイス:ILDAPApi

ILDAPApi は、ディレクトリ サーバ上で次の 2 つの基本操作を提供するメイン インターフェイスです。

Authenticate

Search/Query

ILDAPApi インターフェイスは、Service Portal 全体で LDAP と一貫性を保って対話を行うためのメソッドを提供します。

LDAPEntryBean

ILDAPApi.query(...) メソッドを使用してディレクトリ サーバに対してクエリーまたは検索を行うと、LDAPEntryBean のコレクションとして結果が返されます。

個人のインポート/更新 API

この API を使用すると、個人プロファイルのインポートまたは更新、OU またはグループの作成、OU、グループ、またはロールへの個人のリンクまたはリンク解除を行えます。この API は、個人をインポートするためのトランザクション管理、および SQL データソースへの接続もサポートしています。この API には、CnfParams テーブルから読み込むためのメソッドも含まれています。

個人のインポート/更新 API インターフェイス:ISignOnImportPersonAPI

個人のインポート/更新 API インターフェイスは、次のためのメソッドを提供します。

PersonID または LoginName によって Person オブジェクトを取得する。Person とログイン情報、プリファレンス、ホーム OU、住所、連絡先、場所、および内線番号が返されます。

ログイン情報、プリファレンス、ホーム OU、住所、連絡先、場所、および内線番号を使用して Person を作成する。

ログイン、プリファレンス、ホーム OU、および内線番号を使用して Person を更新する。

OrganizationalUnitID、Name により OU を取得する。OU のメンバは返されません。

特定の Person についてすべての OU を取得する。OU のメンバは返されません。

OU を作成する。

Person と OU をリンク/リンク解除する。

GroupID、Name によって Group を取得する。Group のすべてのメンバは返されません。

特定の個人についてすべてのグループを取得する。

グループを作成する。

個人とグループをリンク/リンク解除する。

名前によりユーザ定義ロールを取得する。

システム定義ロールに対する LogicName オブジェクトを取得する。

LogicName オブジェクトによりシステム定義ロールを取得する。

指定された個人のすべてのロールを取得する。

個人とロールをリンク/リンク解除する。

個人の住所または場所をリンク/更新する。

個人の連絡先を追加/更新/削除する。

Import Person に対するトランザクションの開始、トランザクションのコミット、およびトランザクション リソースのリリースを行う。

SQL データソースへの接続を取得する。

SQL データソース接続でトランザクションをロールバックする。

SQL データソースへの接続を接続プールに戻す。

CnfParams テーブルからパラメータ値を取得する。

詳細については、Java のマニュアルを参照してください。

SQL データソースに接続するための Java クラスのカスタマイズ

SQL データソースに接続するために Java クラスをカスタマイズするには、次の手順に従います。


ステップ 1 DatasourceName を渡すことで、ISignOnImportPersonAPI から SQL データソース データベースへの接続を取得します。DatasourceName には、newscale.properties ファイルの「DatasourceJNDIPrefix」プロパティで定義されているように、JNDI プレフィックスが付加されます。

ステップ 2 JDBC ステートメントを使用してクエリーを実行するには、上記の接続を使用します。

ステップ 3 try ブロックの最後で、接続オブジェクトを直接コミットします。

ステップ 4 障害または例外が発生したときに接続をロールバックするには、ISignOnImportPersonAPI をコールします。

ステップ 5 final ブロックで、ステートメントを直接閉じて ISignOnImportPersonAPI をコールし、接続を解放して接続プールに戻します。


 

ベスト プラクティス

カスタム コード Java ファイルのコンパイル

カスタム コードをコンパイルおよび導入する手順を、次に示します。


ステップ 1 「build.xml ファイルの例」に示す build.xml ファイルをコピーして、任意のフォルダ(C:¥CustomCode など)に貼り付けします。

ステップ 2 build.xml ファイルを編集して、RequestCenter.ear を使用できるフル パスを指すようプロパティ「rcear.dir」を変更します。

ステップ 3 build.xml を編集して、servlet-api.jar を使用できるフル パスを指すようプロパティ「javax.servlet.dir」を変更します。これはアプリケーション サーバに特有の設定です。

ステップ 4 カスタム コード Java ファイル用に、(C:¥CustomCode¥src などの)サブフォルダを作成します。

ステップ 5 「com.newscale.SignOnCustomCode」などのパッケージ名を付けてカスタム コードを作成し、SignOnCustomCode.java ファイルを C:¥CustomCode¥src¥com¥newscale¥SignOnCustomCode.java ディレクトリに配置します。

ステップ 6 C:¥CusomCode フォルダのコマンドラインから「ant」を実行します。

ステップ 7 ant のビルド ファイルは、「src」サブフォルダの下のすべての java ファイルをコンパイルし、クラス ファイルを「out」サブフォルダに配置します。

ステップ 8 ant のビルド ファイルは、「RequestCenter.ear¥RequestCenter.war¥WEB-INF¥classes」フォルダにもクラス ファイルを導入します。

ステップ 9 アプリケーション サーバを再起動します。


 

コーディングのガイドライン

パッケージ名

パッケージ名は com.newscale.[yourcompanyname].* にすることを推奨します。

すべての ContextLocalAttributes の格納には、キー名「com.yourcompanyname.*」を使用します。これにより、内部名前空間でのクラッシュが防止されます。

ロギング

メッセージをサーバ ログに記録するには、System.out.println ではなく Logger を使用します。

デバッグ ログについては、必ずデバッグが有効になっているかどうかを最初に確認します。これはパフォーマンス上、必要です。

例外ブロックをコール元に伝搬する前に、必ずエラーを例外ブロックに記録します。

例外処理

EUIException が取得された場合は、そのままスローして返します。

その他のすべての例外は EUIException としてラップし、スローして返します。

Administration モジュールでのカスタム コードの設定

カスタム コードの開発、コンパイル、および導入が終了したら、そのコードを使用するように Administration モジュールを設定する必要があります。設定には、いつ(どのイベントで)、どの操作で、どの順序(ステップ)でカスタム コードを呼び出すかを指定します。

ステップ 1:グローバル設定の実行

Administration モジュールの [Settings] タブでこの設定をオンにして、Directory Integration が有効になっていることを確認します。Directory Integration をオンにする方法は、「ディレクトリ統合の有効化」に説明があります。

ステップ 2:データソースの設定

カスタマイズされているかどうかに関係なく、大半の操作ではデータソースとマッピングが必要です。このため、最初に Directory Administration の 2 つの領域を設定する必要があります。

データソースは LDAP などの外部サーバであり、ユーザのデータが現在格納されています。Service Portal はデータソースにアクセスする必要があります。データソースが必要ないカスタム操作は SSO だけです。

データソースの設定の詳細については、「データソースの定義」および「データソース情報の設定」を参照してください。

ステップ 3:属性マッピングの設定

外部データソースを設定したら、Service Portal で使用できる個人関連のデータを、LDAP ディレクトリ(または他の外部データソース)内のデータにマップする必要があります。これらのマッピングでは、イベントおよび操作のシーケンスで、どこを検索するか、および何を取得するかが Service Portal に指示されます。

マッピングを設定するには、「マッピングの定義」および「マッピングの設定」のガイドラインと説明に従ってください。

ステップ 4:イベント/カスタマイズ イベントの設定

Login 以外のすべてのイベントに対するシングル サインオン(SSO)および認証の操作のカスタマイズは、不正なアクションとみなされます。これらの操作が必要になるタイミングは他にありません。外部の LDAP サーバから、アプリケーションにユーザがサインインして認証された後は、プロセスを複製する必要がありません。

外部データソースへの接続が必要なすべてのイベントは、ここで設定されます。このガイドに記載されているカスタム コード API を呼び出す場合には、カスタム操作が不正な順序で発生したり、失敗したりしないよう、各イベントに対する操作の順序を考えることが重要です。


ステップ 1 ナビゲーション ペインで [Events] を選択します。

ステップ 2 カスタマイズするイベントの [Edit] をクリックします。

ステップ 3 イベントが無効になっている場合は、ドロップダウン メニューを使用して [Enabled] を選択します。

ステップ 4 [Add step] をクリックして操作を追加します。ここでは、ステップを必要なだけ追加できます。また、各ステップの詳細を設定してから、その次のステップを追加および設定してください。

ステップ 5 ドロップダウン メニューから [Operation] を選択します。

SSO のコードを呼び出すだけの場合は、たとえばメニューから SSO を選択できます。SSO のコードを カスタマイズ するには、[Custom Code] を選択し、次のステップでカスタマイズする操作を選択します。

カスタマイズした操作を設定するには、[Custom Code] を選択します。

ステップ 6 ドロップダウン メニューから [mapping] および [datasource] を選択します。

ステップ 7 「Additional Options」という見出しの下にある [Options] ボタンをクリックします。

ステップ 8 そのステップのオプションを設定します。

カスタム コード操作タイプでは、ドロップダウン メニューを使用して、カスタマイズする操作を選択します。

Java クラスでは、その操作用の全体のパッケージ名を入力してから、その後ろにクラス名を入力します。たとえば、com.newscale.bfw.eui.api.samples.operations. CustomCodeTester のようになります。

この例では、Java クラス名を イタリック体 で示してあります。これらは両方がコード自体の中にあり、コピーすることができます。

ステップ 9 ステップの追加オプションを閉じるには、[Close] をクリックします。

ステップ 10 必要に応じて、ステップの追加と設定を続けます。

ステップ 11 イベント用のすべてのステップを保存するには、[Update] をクリックします。


 

操作タイプとしてのカスタム コードの使用

前述のステップで、操作として [Custom Code] を選択し、操作タイプとして [Custom Code] を選択した場合は、未定義のカスタム コードをコールしているため、設計する必要があります。

シスコが提供しているカスタム コード テストの例では、Java クラス「performCustom」を使用して、独自のカスタム コードを定義できます。

カスタム コードの導入

すべてのカスタム コードは、Service Portal インストーラに対するカスタマイズとしてパッケージ化する必要があります。これにより、インストールの更新が必要な場合や、新しいサイトをインストールする場合に、カスタマイズを再適用できます。

カスタム コードをパッケージおよび導入するための方法は、Service Portal をホストしているアプリケーション サーバによって異なります。詳細は、『Cisco Service Portal Installation Guide』および『Cisco Service Portal Configuration Guide』を参照してください。

API のビュー/用途の例

このソリューションは、次の用途に適しています。

コンテナで管理される SQL データソースから収集されたデータを使用して、個人を検索するイベント クラスを作成する。

コンテナで管理される SQL データソースから収集されたデータを使用して、個人をインポートするイベント クラスを作成する。

コンテナで管理される SQL データソースから収集されたデータを使用して、個人を修正するイベント クラスを作成する。

UI から設定パラメータを受け取ることができるイベント クラスを作成する。この例ではマッピング インターフェイスを使用して、設定パラメータをクラスに渡します。

また、ホーム OU が Service Portal に存在しない場合に、個人のホーム OU を事業部門として作成します。

このソリューションでは、データソースをアプリケーション サーバ上に設定する必要があることに注意してください。以降では、EUIPersonSearchSQL クラスの設定および使用法について説明します。

SQL データソース

個人プロファイルの必須フィールドのデータが含まれている(または、これらのフィールドの値を得ることができる)SQL テーブルは、データソースとして使用できます。次に、この例で使用されるテーブルの定義を示します。

CREATE TABLE [psgextusers] (
[login] [nvarchar] (100) COLLATE Latin1_General_CI_AI NOT NULL,
[firstname] [nvarchar] (100) COLLATE Latin1_General_CI_AI NULL,
[lastname] [nvarchar] (100) COLLATE Latin1_General_CI_AI NULL,
[password] [nvarchar] (100) COLLATE Latin1_General_CI_AI NULL,
[email] [nvarchar] (100) COLLATE Latin1_General_CI_AI NULL,
[homeOU] [nvarchar] (100) COLLATE Latin1_General_CI_AI NULL,
CONSTRAINT [PK_extuser] PRIMARY KEY CLUSTERED
(
[login]
) ON [PRIMARY]
) ON [PRIMARY]
GO
 

次に、上記のテーブル定義で使用するサンプル データの一部を示します。

INSERT INTO [RequestCenter].[dbo].[psgextusers]([login], [firstname], [lastname], [password], [email], [homeOU])VALUES('Moe', 'Moe', 'Howard', 'Moe', 'moe@stooge.com', 'Nyuk Nyuk Nyuk')
INSERT INTO [RequestCenter].[dbo].[psgextusers]([login], [firstname], [lastname], [password], [email], [homeOU])VALUES('Larry', 'Larry', 'Fine', 'Larry', 'larry@stooge.com', 'Nyuk Nyuk Nyuk')
INSERT INTO [RequestCenter].[dbo].[psgextusers]([login], [firstname], [lastname], [password], [email], [homeOU])VALUES('Curly', 'Curly', 'Howard', 'Curly', 'curly@stooge.com', 'Nyuk Nyuk Nyuk')
INSERT INTO [RequestCenter].[dbo].[psgextusers]([login], [firstname], [lastname], [password], [email], [homeOU])VALUES('Shemp', 'Shemp', 'Howard', 'Shemp', 'shemp@stooge.com', 'Nyuk Nyuk Nyuk')
 

データソースの定義

Directory Integration インターフェイスを使用するには、LDAP データソースを設定しておく必要があります。LDAP は、データソースでサポートされている唯一の UI です。データソースなしでマップを作成できますが、LDAP データソースなしではテストできません。

図 1-16 データソース設定の例

 

コンテナで管理されるデータソースの設定は、コンテナによって異なります。Websphere および Weblogic コンテナには、データソースを作成するための詳細な手順説明があります。この説明を利用すると、他のデータソースの作成方法を補足できます。JBoss では、RequestCenter.war/config ディレクトリに xml ファイルを作成するプロセスになります。最も簡単な方法は、Service Portal 用のものをコピーし(通常は mssql-ds.xml のような名前)、接続パラメータを変更することです。JBoss は、このディレクトリ内のファイルを定期的にポーリングし、すぐにデータソース オブジェクトを作成しようとします。データソースの設定の詳細については、『 Cisco Service Portal Installation Guide 』に説明があります。

マッピングの例

EUIPersonSearchSQL クラスに対するマッピングを作成する必要があります。

図 1-17 マッピングの設定例

 

このマッピングには、Custom 9 として JNDI への参照が含まれ、Custom 10 にはテーブル名の参照が含まれています。このようなマッピングを使用すると、「select * from tablename」のような簡単なクエリーを実行し、JDBC のメタデータ機能を使用して、マッピングに基づいてカラムを選択することができます。

イベントの設定例

「Person Lookup for Order on Behalf」イベントには 2 つのステップがあり、最初のステップでは「Person Search」操作を実行する必要があります。クラスの名前はマッピングとして与えられます。パッケージの仕様全体は、Java クラスとして与えられます。

図 1-18 カスタム Person Search 操作

 

「Person Lookup for Order on Behalf」イベントの 2 番めのステップは、選択した個人のインポート(「Import Person」)です。この設定では同じ Java クラスを使用しますが、カスタム コード操作タイプは異なります。ドロップダウンのカスタム コード操作タイプは、インターフェイス クラスでコールされるメソッドに対応したものとなります。

図 1-19 イベントのステップ 2:カスタム Import Person 操作

 

SQL ベースの個人検索のサンプル コード

次に、カスタム クラスのソースを示します。

package com.newscale.profsvcs.eui;
 
import com.newscale.api.person.*;
import com.newscale.bfw.eui.EUIException;
import com.newscale.bfw.eui.api.*;
import com.newscale.bfw.ldap.ILDAPApi;
import com.newscale.bfw.logging.ILogUtil;
import com.newscale.bfw.logging.LogUtilFactory;
import com.newscale.comps.extuserintegration.session.*;
 
import javax.servlet.http.HttpServletRequest;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
 
/**
* Person Search to an external SQL datasource
*
* @author Lee Weisz
* @version $Revision$
*/
public class EUIPersonSearchSql implements IPersonSearch {
/**
* Logger instance
*/
private ILogUtil log = LogUtilFactory.getLogUtil(EUIPersonSearchSql.class);
 
/**
* Implement Person Search Operation and fetch users from an external system
*
* @param euiOperationDTO .
* @param euiPersonSearchOperationContext
*
* @param request .
* @param signOnImportPersonAPI
* @param ldapApi
* @return .
* @throws EUIException .
*/
public IEUIPersonSearchOperationResult search(IEUIEventPersonSearchOperationDTO euiOperationDTO,
IEUIPersonSearchOperationContext euiPersonSearchOperationContext,
HttpServletRequest request,
ISignOnImportPersonAPI signOnImportPersonAPI, ILDAPApi ldapApi)
throws EUIException {
 
log.debug("search: Entering search method...");
IEUIPersonSearchOperationResult euiOperationResult = euiPersonSearchOperationContext
.getEUIPersonSearchOperationResult();
 
// Check if there is any SearchPerson List already available, if so we
// can append to the existing List
 
// Typically if there is a productized Person Search Operation is
// configured before the custom code, this list would be populated
 
// TODO Why is this an ArrayList?Can't it be a List?
ArrayList personList = euiOperationResult.getSearchPersonList();
 
if (null == personList) {
personList = new ArrayList();
}
 
// Get the search criteria from the dialog box
String searchFirstName = euiPersonSearchOperationContext.getFirstNameSearchString();
String searchLastName = euiPersonSearchOperationContext.getLastNameSearchString();
 
log.debug("search: Looking for " + searchFirstName + " " + searchLastName);
 
EUIDataMappingDTO dataMappingDTO = euiOperationDTO.getEuiMappingDTO();
Map attributeMap = dataMappingDTO.getAllAttributeMap();
 
// What's in this map?
if (log.isDebugEnabled()) {
Set ks = attributeMap.keySet();
for (Iterator it = ks.iterator(); it.hasNext();) {
Object key = it.next();
log.debug("search: " + key + " is " + attributeMap.get(key));
}
}
 
// Use the map to map the columns to Person fields
String firstNameColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_FIRSTNAME);
String lastNameColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_LASTNAME);
String loginColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_LOGINID);
 
// Use the custom9 mapping to hold the datasource value and custom10 to
// hold the tablename.Since we control the import as well, it won't show up
// in the imported Person's profile
String ds = (String) attributeMap.get("custom9");
String sourceTable = (String) attributeMap.get("custom10");
 
 
StringBuffer searchSQL;
searchSQL = new StringBuffer().append("select ")
.append(firstNameColumn).append(", ")
.append(lastNameColumn).append(", ")
.append(loginColumn).append(" from ")
.append(sourceTable);
 
if (searchFirstName != null && searchFirstName.trim().length() > 0 ||
searchLastName != null && searchLastName.trim().length() > 0) {
searchSQL.append(" where ");
 
if (searchFirstName != null && searchFirstName.trim().length() > 0) {
searchSQL.append(firstNameColumn).append(" like '").append(searchFirstName.trim()).append("%'");
}
 
if (searchFirstName != null && searchFirstName.trim().length() > 0 &&
searchLastName != null && searchLastName.trim().length() > 0) {
searchSQL.append(" and ");
}
 
if (searchLastName != null && searchLastName.trim().length() > 0) {
searchSQL.append(lastNameColumn).append(" like '").append(searchLastName.trim()).append("%'");
}
}
 
log.debug("search: " + searchSQL.toString());
 
Connection conn = null;
Statement s = null;
 
// get a connection to the external db
try {
conn = signOnImportPersonAPI.getExternalDBConnection(ds);
 
s = conn.createStatement();
ResultSet rs = s.executeQuery(searchSQL.toString());
 
while (rs.next()) {
String fname = rs.getString(firstNameColumn);
String lname = rs.getString(lastNameColumn);
String login = rs.getString(loginColumn);
 
IExtUserDTO extUserDTO = PersonFactory.createExtUserDTO();
IPersonDTO personDTO = PersonFactory.createPersonDTO();
 
personDTO.setFirstName(fname);
personDTO.setLastName(lname);
personDTO.setPersonIdentification(login);
 
// Make the IPersonDTO into an IExtPersonDTO
extUserDTO.setPersonDTO(personDTO);
// Add IExtUserDTO to the collection of searched persons
personList.add(extUserDTO);
}
} catch (SQLException e) {
log.error("search: " + searchSQL.toString(), e);
} catch (SignOnImportPersonAPIException e) {
log.error("search: Cannot get a connection to " + ds, e);
} finally {
try {
s.close();
} catch (SQLException e) {
e.printStackTrace();
}
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
 
// Set the list of Persons Searched into the Result to be returned
euiOperationResult.setSearchPersonList(personList);
 
log.debug("search: Leaving search method...");
return euiOperationResult;
}
 
/**
* Implement the Import Person Operation to Import a user from External
* system
*
* @param euiOperationDTO .
* @param euiPersonSearchOperationContext
* .
* @param request .
* @param signOnImportPersonAPI
* @param ldapApi
* @return .
* @throws EUIException .
*/
public IEUIPersonSearchOperationResult importPerson(IEUIEventImportPersonOperationDTO euiOperationDTO,
IEUIPersonSearchOperationContext euiPersonSearchOperationContext,
HttpServletRequest request,
ISignOnImportPersonAPI signOnImportPersonAPI, ILDAPApi ldapApi)
throws EUIException {
 
log.debug("importPerson: Entering importPerson method...");
 
/* Potentially useful stuff on the request...
Name : isOOB Value : true/false
Name : customerid Value : personDTO.setPersonIdentification() from search
Name : customerId Value : personDTO.setPersonIdentification() from search
Name : lDAPCustomerId Value : personDTO.setPersonIdentification() from search
*/
 
// What's on this request?
if (log.isDebugEnabled()) {
log.debug("importPerson: Parameters collected from the search window...");
Enumeration paramNames = request.getParameterNames();
 
if (paramNames.hasMoreElements()) {
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String paramValues[] = request.getParameterValues(paramName);
if (paramValues != null) {
log.debug("importPerson: Name : " + paramName);
for (int i = 0; i < paramValues.length; i++) {
log.debug("importPerson: Value : " + paramValues[i]);
}
}
}
}
}
 
boolean refreshPerson = true;
String login = request.getParameter("customerId");
 
// Defaults
String homeOU = "";
String firstName = "";
String lastName = "";
String email = "";
String password = "password";
 
// Get the UI mapping
EUIDataMappingDTO dataMappingDTO = euiOperationDTO.getEuiMappingDTO();
Map attributeMap = dataMappingDTO.getAllAttributeMap();
 
// Use the map to map the columns to Person fields
String firstNameColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_FIRSTNAME);
String lastNameColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_LASTNAME);
String loginColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_LOGINID);
String passwordColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_PASSWORD);
String emailColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_EMAILADDRESS);
String homeOUColumn = (String) attributeMap.get(EUIAPIConstants.EUIMAPFIELDTYPE.ATTR_HOMEORGANIZATIONLUNIT);
 
// Use the custom9 mapping to hold the datasource value and custom10 to
// hold the tablename.Since we control the import as well, it won't show up
// in the imported Person's profile unless we screw up somehow and put it there...
String ds = (String) attributeMap.get("custom9");
String sourceTable = (String) attributeMap.get("custom10");
 
StringBuffer importSQL;
importSQL = new StringBuffer().append("select ")
.append(firstNameColumn).append(", ")
.append(lastNameColumn).append(", ")
.append(loginColumn).append(", ")
.append(passwordColumn).append(", ")
.append(emailColumn).append(", ")
.append(homeOUColumn)
.append(" from ").append(sourceTable).append(" where ")
.append(loginColumn).append("='").append(login).append("'");
 
log.debug("import: " + importSQL.toString());
 
Connection conn = null;
Statement s = null;
 
try {
// get a connection to the external db
conn = signOnImportPersonAPI.getExternalDBConnection(ds);
s = conn.createStatement();
ResultSet rs = s.executeQuery(importSQL.toString());
 
while (rs.next()) {
homeOU = rs.getString(homeOUColumn);
firstName = rs.getString(firstNameColumn);
lastName = rs.getString(lastNameColumn);
email = rs.getString(emailColumn);
password = rs.getString(passwordColumn);
}
} catch (SQLException e) {
log.error("import: " + importSQL.toString(), e);
} catch (SignOnImportPersonAPIException e) {
log.error("import: Cannot get a connection to " + ds, e);
} finally {
try {
s.close();
} catch (SQLException e) {
log.error("import: ", e);
}
try {
conn.close();
} catch (SQLException e) {
log.error("import: ", e);
}
}
 
log.debug("import : Got " + login + "," + firstName + "," + lastName + "," + email + "," + password + "," + homeOU);
 
IPersonDTO personDTO = PersonFactory.createPersonDTO();
try {
// Get or Create the Person
// This API throws an exception if the Person is not found in Request Center
try {
personDTO = signOnImportPersonAPI.getPersonByLoginName(login);
log.info("importPerson: " + login + " exists in Request Center");
} catch (SignOnImportPersonAPIException impEx) {
log.info("importPerson: Creating new Person for " + login);
refreshPerson = false;
personDTO.setLogin(login);
}
 
// Get or Create the Home OU that the Person should be associated with
// This API throws an exception if the OU is not found in Request Center
IOrganizationalUnitDTO homeOUDTO;
try {
homeOUDTO = signOnImportPersonAPI.getOrgUnitByName(homeOU);
log.info("importPerson: " + homeOU + " exists in Request Center");
} catch (SignOnImportPersonAPIException impEx) {
log.info("importPerson: Creating new OU " + homeOU + " for " + login);
homeOUDTO = PersonFactory.createOrganizationalUnitDTO();
homeOUDTO.setName(homeOU);
homeOUDTO.setBillable(false);
homeOUDTO.setOrganizationalUnitTypeId(2); // business unit.
homeOUDTO.setRecordStateId(1); // active
homeOUDTO.setLocaleId(EUIAPIConstants.LOCALEID.USEN);
try {
homeOUDTO = signOnImportPersonAPI.createOrgUnit(homeOUDTO);
} catch (SignOnImportPersonAPIException crEx) {
log.error("importPerson: Can't create " + homeOU + " for " + login);
throw crEx;
}
}
personDTO.setHomeOrganizationalUnitId(homeOUDTO.getId());
 
// Populate the Login Object...
// Modify the login information only if this is a new Person
if (!refreshPerson) {
ILoginInfoDTO loginInfoDTO = PersonFactory.createLoginInfoDTO();
 
loginInfoDTO.setLoginname(personDTO.getLogin());
loginInfoDTO.setPrivateKey(personDTO.getLogin());
// Set the un-encrypted password
loginInfoDTO.setPassword(password);
 
// Set ILoginInfoDTO to IPersonDTO
personDTO.setILoginInfoDTO(loginInfoDTO);
}
 
// Populate the rest of the essential fields
// Presumably, any expression on the mapping will have already been executed
// and the result is what's returned in the personDTO
personDTO.setFirstName(firstName);
personDTO.setLastName(lastName);
personDTO.setEmail(email);
 
// Set the active status
// TODO These methods are bogus...
// personDTO.setIsInactive(false);
// personDTO.setIsActive(true);
// TODO What do these numbers mean?Is there a constants library to convert these codes into something meaningful?
personDTO.setRecordStateId(1);
 
// Upsert the Person
signOnImportPersonAPI.beginTransaction();
if (refreshPerson) {
// Update the existing Person
// This method updates only Basic Info, LoginInfo, Preferences, Home OU and Person Extension
signOnImportPersonAPI.updatePerson(personDTO);
} else {
// Create the Person
// This creates a Person with Basic Info, LoginInfo, Preferences, Home OU and Person Extension
personDTO = signOnImportPersonAPI.createPerson(personDTO);
// From here on out it's a refresh
refreshPerson = true;
}
signOnImportPersonAPI.commitTransaction();
} catch (Exception e) {
log.error("importPerson: Exception during Import Person", e);
try {
// Rollback Transaction
signOnImportPersonAPI.rollbackTransaction();
} catch (SignOnImportPersonAPIException se) {
log.error("importPerson: Error while Rolling back transaction", se);
}
} finally {
// Release Transaction
signOnImportPersonAPI.releaseTransaction();
}
 
IExtUserDTO extUserDTO = PersonFactory.createExtUserDTO();
extUserDTO.setPersonDTO(personDTO);
 
IEUIPersonSearchOperationResult psor = euiPersonSearchOperationContext.getEUIPersonSearchOperationResult();
psor.setImportedPersonExtDTO(extUserDTO);
 
log.debug("importPerson: Leaving importPerson method...");
 
return psor;
}
 
/**
* Implement Import Manager Operation and Import all the Supervisors chain
* of the Person being imported
*
* @param euiOperationDTO .
* @param euiPersonSearchOperationContext
* .
* @param request .
* @param signOnImportPersonAPI
* @param ldapApi
* @return .
* @throws EUIException .
*/
public IEUIPersonSearchOperationResult importManager(IEUIEventImportManagerOperationDTO euiOperationDTO,
IEUIPersonSearchOperationContext euiPersonSearchOperationContext,
HttpServletRequest request,
ISignOnImportPersonAPI signOnImportPersonAPI, ILDAPApi ldapApi)
throws EUIException {
return null;
}
 
/**
* Implement any Custom Operation
*
* @param euiOperationDTO .
* @param euiPersonSearchOperationContext
*
* @param request .
* @param signOnImportPersonAPI
* @param ldapApi
* @return .
* @throws EUIException .
*/
public IEUIPersonSearchOperationResult performCustom(IEUIEventCustomOperationDTO euiOperationDTO,
IEUIPersonSearchOperationContext euiPersonSearchOperationContext,
HttpServletRequest request,
ISignOnImportPersonAPI signOnImportPersonAPI, ILDAPApi ldapApi)
throws EUIException {
return null;
}
}

サポートされるタイム ゾーン

タイム ゾーンのマッピングにサポートされているタイム ゾーンは、次のとおりです。

時間帯名
GMT 相当

Etc/GMT+12

(GMT-12:00)日付変更線、西側

Pacific/Apia

(GMT-11:00)サモア

US/Hawaii

(GMT-10:00)ハワイ

US/Aleutian

(GMT-10:00)ハワイ アリューシャン夏時間

US/Alaska

(GMT-09:00)アラスカ

America/Tijuana

(GMT-08:00)太平洋標準時(米国およびカナダ)

America/Chihuahua

(GMT-07:00)チワワ、ラパス、マサトラン

US/Arizona

(GMT-07:00)アリゾナ

Canada/Mountain

(GMT-07:00)山岳部標準時(米国およびカナダ)

Canada/Saskatchewan

(GMT-06:00)サスカチュワン

US/Central

(GMT-06:00)中央アメリカ

Canada/Central

(GMT-06:00)中央標準時(米国およびカナダ)

America/Mexico_City

(GMT-06:00)グアダラハラ、メキシコシティー、モンテレイ

America/Bogota

(GMT-05:00)ボゴタ、リマ、キト

Canada/Eastern

(GMT-05:00)東部夏時間(米国およびカナダ)

America/Jamaica

(GMT-05:00)東部標準時(米国およびカナダ)

US/East-Indiana

(GMT-05:00)インディアナ(東部)

America/Antigua

(GMT-04:00)大西洋標準時(カナダ)

Canada/Atlantic

(GMT-04:00)大西洋夏時間(カナダ)

America/Manaus

(GMT-04:00)マナウス

America/Santiago

(GMT-04:00)サンチャゴ

America/Caracas

(GMT-04:30)カラカス

America/La_Paz

(GMT-04:00)ラパス(ボリビア)

America/Sao_Paulo

(GMT-03:00)ブラジリア

America/Godthab

(GMT-03:00)グリーンランド

America/Argentina/Buenos_Aires

(GMT-03:00)ブエノスアイレス

America/Guyana

(GMT-04:00)ジョージタウン

America/St_Johns

(GMT-03:30)ニューファンドランドおよびラブラドル

Atlantic/South_Georgia

(GMT-02:00)中部大西洋

Atlantic/Azores

(GMT-01:00)アゾレス諸島

Atlantic/Cape_Verde

(GMT-01:00)カーボベルデ諸島

Etc/Greenwich

(GMT)グリニッジ標準時、ダブリン、エディンバラ、リスボン、ロンドン

Africa/Casablanca

(GMT)カサブランカ、モンロビア

Europe/Sarajevo

(GMT+01:00)サラエボ、スコピエ、ワルシャワ、ザグレブ

Europe/Brussels

(GMT+01:00)ブリュッセル、コペンハーゲン、マドリッド、パリ

Africa/Brazzaville

(GMT+01:00)アフリカ中西部

Europe/Amsterdam

(GMT+01:00)アムステルダム、ベルリン、ベルン、ローマ、ストックホルム、ウィーン

Europe/Belgrade

(GMT+01:00)ベオグラード、ブラチスラバ、ブダペスト、リュブリャナ、プラハ

Africa/Cairo

(GMT+02:00)カイロ

Europe/Helsinki

(GMT+02:00)ヘルシンキ、キエフ、リガ、ソフィア、タリン、ヴィルニアス

Europe/Minsk

(GMT+02:00)ミンスク

Europe/Athens

(GMT+02:00)アテネ、ブカレスト、イスタンブール

Asia/Jerusalem

(GMT+02:00)エルサレム

Africa/Windhoek

(GMT+02:00)ビントフック

Africa/Harare

(GMT+02:00)ハラーレ、プレトリア

Asia/Baghdad

(GMT+03:00)バグダッド

Africa/Nairob

(GMT+03:00)ナイロビ

Europe/Moscow

(GMT+03:00)モスクワ、サンクトペテルスブルク、ボルゴグラード

Asia/Kuwait

(GMT+03:00)クウェート、リヤド

Asia/Tehran

(GMT+03:30)テヘラン

Asia/Baku

(GMT+04:00)バクー

Asia/Muscat

(GMT+04:00)アブダビ、マスカット

Asia/Yerevan

(GMT+04:00)エレヴァン

Asia/Tbilisi

(GMT+04:00)トビリシ

Asia/Kabul

(GMT+04:30)カブール

Asia/Karachi

(GMT+05:00)イスラマバード、カラチ、タシケント

Asia/Yekaterinburg

(GMT+05:00)エカチェリンブルグ

Asia/Kolkata

(GMT+05:30)チェンナイ、コルカタ、ムンバイ、ニューデリー

Asia/Kathmandu

(GMT+05:45)カトマンズ

Asia/Dhaka

(GMT+06:00)アスタナ、ダッカ

Asia/Novosibirsk

(GMT+07:00)ノボシビルスク

Asia/Colombo

(GMT+05:30)スリジャヤワルダナプラコッテ

Asia/Rangoon

(GMT+06:30)ヤンゴン(ラングーン)

Asia/Bangkok

(GMT+07:00)バンコク、ハノイ、ジャカルタ

Asia/Krasnoyarsk

(GMT+08:00)クラスノヤルスク

Asia/Irkutsk

(GMT+09:00)イルクーツク

Asia/Kuala_Lumpur

(GMT+08:00)クアラルンプール、シンガポール

Asia/Taipei

(GMT+08:00)タイペイ

Australia/Perth

(GMT+08:00)パース

Asia/Chongqing

(GMT+08:00)北京、重慶、香港特別自治区、ウルムチ

Asia/Seoul

(GMT+09:00)ソウル

Asia/Tokyo

(GMT+09:00)大阪、札幌、東京

Asia/Yakutsk

(GMT+09:00)ヤクーツク

Australia/Darwin

(GMT+09:30)ダーウィン

Australia/Adelaide

(GMT+09:30)アデレード

Australia/Hobart

(GMT+10:00)ホバート

Australia/Canberra

(GMT+10:00)キャンベラ、メルボルン、シドニー

Australia/Brisbane

(GMT+10:00)ブリズベン

Asia/Vladivostok

(GMT+10:00)ウラジオストク

Pacific/Guam

(GMT+10:00)グアム、ポートモレスビー

Pacific/Guadalcanal

(GMT+11:00)ソロモン諸島、ニューカレドニア

Pacific/Auckland

(GMT+12:00)オークランド、ウェリントン

Pacific/Fiji

(GMT+12:00)フィジー島

Pacific/Tongatapu

(GMT+13:00)ヌークアロファ

build.xml ファイルの例

<?xml version="1.0" ?>
<project name="Sample Project" default="all" basedir=".">
- <!-- Main target -->
<target name="all" depends="init,build,deploy" />
<!-- Set the following properties to point to appropriate folders -->
<property name="rcear.dir" value="<apps server path where Request Center application is deployed>/RequestCenter.ear" />
<property name=" javax.servlet.dir" value="<path where javax.servlet is available in the app server>" />
<property name="rcwar_webinf_classes.dir"
  value="${rcear.dir}/RequestCenter.war/WEB-INF/classes" />
<target name="init">
  <property name="dirs.base" value="${basedir}" />
  <mkdir dir="${dirs.base}/out" />
  <property name="src" value="${dirs.base}/src" />
  <property name="out" value="${dirs.base}/out" />
</target>
  <path id="classpath">
    <fileset dir="${rcear.dir}" includes="*.jar" />
    <fileset dir="${javax.servlet.dir}" includes="javax.servlet.jar" />
    <pathelement path="${rcwar_webinf_classes.dir}" />
  </path>
- <!-- Compile Java Files -->
<target name="build" depends="init">
<javac srcdir="${src}" destdir="${out}" debug="true" includes="**/*.java"
classpathref="classpath" deprecation="true" fork="true" memoryinitialsize="256M"
memorymaximumsize="512M" />
</target>
<target name="deploy" depends="init">
<copy todir="${rcwar_webinf_classes.dir}">
<fileset dir="${out}">
<include name="**/*.class" />
</fileset>
</copy>
</target>
</project>