この章では、Identity Governance Framework ArisID API (ArisID API)のアーキテクチャと主要な機能について説明します。ArisID APIは、エンタープライズ開発者とシステム設計者に、複数のアイデンティティ・プロトコルを使用したアイデンティティ対応のアプリケーションを作成するためのライブラリを提供します。ArisID APIでは、開発者は、Client Attribute Requirements Markup Language (CARML)を使用して、アイデンティティの属性、ロールおよび検索フィルタの要件を指定できます。この章の内容は次のとおりです。
Identity Governance Framework ArisID APIは、すべてのアイデンティティ情報交換の受渡しに使用される共通のコア・サービスを表します。正式な名称ではありませんが、ArisID APIは、開発者からアイデンティティBeanと呼ばれることが多くあります。
11gリリース2(11.1.2)のArisID APIは、次に提案されている構成のサブセットです。
http://www.openliberty.org/wiki/index.php/ArisID_Configuration
.
Oracle WebLogic ServerとOracle Identity Managementをインストールしてある場合、このAPIを使用したアプリケーションの開発に必要なjarファイルはすべて、コンピュータにすでにインストールされています。
関連項目:
|
Identity Governance Frameworkオープン・ソースAPI jarファイルは次のとおりです。
openliberty.arisId_1.1.jar: 属性のセットを含むアイデンティティ・サブジェクトの取得に使用されるライブラリ関数とプロバイダを含んだコアArisID APIを提供します。詳細は、http://arisid.sourceforge.net/javadocs/arisId_1.1_javadoc/
を参照してください。
org.openliberty.arisIdBeans_1.1.jar: ArisID APIに加えてJavaオブジェクトの抽象化を提供するArisID Beanを提供します。これらによって、ArisID APIのトランザクション型アプローチをオブジェクトまたはBean型のアプローチに変換します。詳細は、http://arisid.sourceforge.net/javadocs/arisId_1.1_javadoc/
を参照してください。
ArisID API jarファイルは次のとおりです。
idxuserrole.jar: 標準的なユーザーとロールのアイデンティティの読取り専用操作を提供します。このjarは、標準のidxuserrole.xml CARMLファイルから生成されます。詳細は、『Oracle Fusion Middleware Identity Governance Framework IDXUserRole Java APIリファレンス』を参照してください。
userrole.jar: アイデンティティ情報を更新するためのユーザーとロールのアイデンティティ読取り/書込み操作を提供します。詳細は、『Oracle Fusion Middleware Identity Governance Framework UserRole APIリファレンス』を参照してください。
arisId-stack-ovd.jar: このjarファイルはOracle Virtualizationライブラリを使用したIAttrSvcStack
インタフェースの実装で、異なるバックエンドに接続し、アイデンティティ・ストア・エンティティの抽象ビューを提供します。
ArisID Beanによって、CARML対話の初期化とアクセスに必要なJava APIが提供されます。Beanジェネレータでは、Apache Velociyを使用してCARMLファイル内の各エンティティに対するjavaファイルのセットを生成します。CARMLファイルは、アプリケーションの属性使用要件を記述する宣言型のドキュメントです。ArisID Beanは、jarファイルidxuserrole.jarおよびuserrole.jar内にあります。標準のArisID Beanがニーズを満たさない場合、CARMLファイルを作成し、Identity Governance Framework ArisID JDeveloper拡張のBeanジェネレータを使用して、新たにArisID Beanを生成できます。
次の図に、ArisID APIアーキテクチャの概要を示します。
Identity Governance Framework ArisID拡張では、作成 > 変更 > テスト > デプロイといった基本的な開発プロセスがサポートされます。作成では、新規JDeveloperプロジェクトの開始とCARMLファイルの作成が必要です。CARMLエディタを使用して、環境に合せてCARML XMLファイルを変更します。アプリケーションのテストは、LDAPディレクトリ・サーバーが組み込まれたOracle WebLogic Serverで行えます。
この項では、次の項目について説明します。
CARMLファイルidxuserrole.xml(読取り専用操作)とuserrole.xml(読取り専用および読取り/書込み操作)を確認して、既存のArisID Beanがアプリケーションのニーズを満たすかどうかを判断します。これらのファイルは、DOMAIN_HOME/config/fmwconfig/carmlにあります。追加属性または他のカスタマイズが必要な場合、第3.4項「ArisID APIを使用したアプリケーションの開発」に記載のように、新たにCARMLファイルを作成してBeanを生成します。
ArisID Beanによって使用されるアイデンティティ・リポジトリを使用可能にする必要があります。LDAPベースのディレクトリ・サーバーが組み込まれたOracle WebLogic Serverまたは11gのOracle Virtual Directoryでサポートされている任意のLDAPディレクトリを使用できます。ArisID APIは、Oracle Platform Security Servicesと統合されています。Oracle Platform Security Servicesに構成されているLDAPベースのアイデンティティ・ストアに自動的に接続します。Oracle Platform Security Servicesでサポートされているアイデンティティ・ストアの詳細は、「システム要件と動作保証情報」を参照してください。
Oracle Platform Security Servicesの詳細は、『Oracle Fusion Middlewareアプリケーション・セキュリティ・ガイド』を参照してください。
Oracle Platform Security Servicesアイデンティティ・ストアとは異なるアイデンティティ・ストアを使用する必要がある場合、次のシステム・プロパティを設定します。
igf.ovd.config.dir=DOMAIN_HOME/config/fmwconfig/arisidprovider/conf
次に、adapters.os_xmlファイルを編集して、接続先のディレクトリのhost
、port
および資格証明を含めます。igf.ovd.config.dir
プロパティは、adapaters.os_xmlおよび適切に設定された他の構成ファイルを含む任意のディレクトリに設定できます。
OpenLDAPの場合、Role.MEMBER
は次のAPIに必須の属性です。
createRole(List<PropertyValue> attrVals, Map<String,Object> appCtxMap)
createRole(List<PropertyValue> attrVals)
入力attrVals
リストにRole.MEMBER
が含まれていない場合、ロールの作成は失敗します。
CARMLファイルが作成されている場合、対応するマッピング・ファイルは同じ場所に作成されます。デフォルトのマッピング・ファイルには、Oracle WebLogic Serverに組み込まれているディレクトリ・サーバー(Oracle Platform Security Servicesのデフォルト・アイデンティティ・ストア)に固有の属性詳細が含まれています。デフォルトのCARMLファイルとOracle Platform Security Servicesアイデンティティ・ストアを使用する場合、マッピングを構成する必要ばありません。Oracle Platform Security Servicesの構成パラメータは、マッピング・ファイルのパラメータをオーバーライドします。
追加属性を使用して独自のCARMLファイルを作成する場合、またはOracle Platform Security Servicesアイデンティティ・ストア以外のストアを使用する場合、マッピング・ファイルを編集する必要があります。詳細は、第3.4項「ArisID APIを使用したアプリケーションの開発」を参照してください。
デフォルトのCARMLファイルとマッピング・ファイルには、デプロイ・シナリオについて特定の想定がなされています。デプロイ要件によっては、これらの詳細を変更する必要がある場合があります。この項では、変更可能な構成パラメータについて説明します。
この項では、次の項目について説明します。
デフォルトの構成では、ユーザー・エントリを識別するための一意の識別子としてemail
が使用されます。ユーザーの検索時、検索に想定されているデフォルトの属性はemail
です。次に例を示します。
SearchUser( String uniqueid, Map<String, Object>)
パフォーマンス上の理由から、一意の識別子として使用される属性は、バックエンドで検索可能な属性である必要があります。アプリケーションが選択したuniquekey
とバックエンドの属性との間のマッピングは、構成時に処理されます。これは、Oracle Virtual Directoryマッピングでの構成です。HashMap
を使用して、操作の実行時に使用するオプションのコンテキスト情報を指定します。現在のリリースでは、次のオプションがサポートされます。
検索を実行するプリンシパル・ユーザー: (ArisIdConstants.APP_CTX_AUTHUSER, (Principal)user
)
言語の制約(ある場合): (ArisIdConstants.APP_CTX_LOCALE, "fr"
)
ページネーション・サポート(ある場合): (ArisIdConstants.APP_CTX_PAGESIZE, 10
)
アプリケーションで、アイデンティティ・リポジトリのバックエンドからアクセスされるエントリをアプリケーション固有のリポジトリに格納することがあります。このような場合、永続化する属性を慎重に検討する必要があります。たとえば、バックエンドがLDAPベースのリポジトリの場合、GUID
属性がLDAPベースのバックエンドで唯一の一意のキーであるため、永続化属性としてこれを使用します。他のLDAP属性はすべて変更可能です。
バックエンドがリレーショナル・データベースの場合、一意性制約が適用される属性を一意キーとして選択します。これは、ArisIDマッピング・プロパティ・ファイルで指定できます。一意キーに基づいてユーザーを検索するメソッドは次のとおりです。
searchUserOnUniqueKey(String UniqueKey, Map<String,Object>)
HashMap
を使用して、操作の実行時に使用するオプションのコンテキスト情報を指定します。現在のリリースでは、次のオプションがサポートされます。
検索を実行するプリンシパル・ユーザー: (ArisIdConstants.APP_CTX_AUTHUSER, (Principal)user
)
言語の制約(ある場合): (ArisIdConstants.APP_CTX_LOCALE, "fr"
)
ページネーション・サポート(ある場合): (ArisIdConstants.APP_CTX_PAGESIZE, "10"
)
ロケール固有の結果を必要とするアプリケーション向けに複数言語サポート(MLS)が提供されます。属性と適切なMLSコードは、ArisIDプロパティ・ファイルのmultiLanguageAttributes
要素に格納されます。
<multiLanguageAttributes>…</multiLanguageAttribute>
displayname
は、最もよく使用される複数言語属性であるため、デフォルトで複数言語属性として構成されています。必要に応じて他の属性をArisIDマッピング・ファイルに追加できます。
制限
引数としてロケールが指定されるAPIでは、ArisIDプロパティ・ファイルに<multiLanguageAttributes>
としてリストされている、ロケール固有の値を持つすべての属性に対してロケール固有の値が返されます。他の属性についてはすべて、格納されているデフォルト値が返されます。
バックエンドのシステムでは、データはISO-3166に準拠した形式で返されます。たとえば、(英語の他に)フランス語のロケールがある場合、cn
属性に対してcn,:fr
として格納されます。クライアント・アプリケーションのロケールは、プロパティHashMap
にArisIdConstants.APP_CTX_LOCALE, "fr"
と指定し、ArisIDプロパティ・ファイルにcn
をmultiLanguageAttribute
として含め、この属性をマップします。
アプリケーションでアイデンティティ・データにアクセスする場合、検索の結果セットが大きすぎてアプリケーションで処理できない場合があります。そのような場合、管理可能なサイズのページに結果を分割することができます。これは、ページで返されるオブジェクトの数を定義することで行います。
次の例に、標準的な使用法を示します。
RoleManager rm = new RoleManager(env); List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>(); attrFilters.add(new PropertyFilterValue(Role.NAME, "admin", AttributeFilter.OP_CONTAINS)); HashMap<String,Object> map = new HashMap<String,Object>(); map.put("ArisIdConstants.APP_CTX_PAGESIZE","2"); SearchResults<Role> sr = rm.searchRolesbyPage(attrFilters, map); while(sr.hasMore()) { List<Role> roles = sr.getNextSet(); for (int i=0; i<roles.size(); i++) //do the operations with roles.get(i) }
ターゲット・システムでの作成、読取り、更新および削除(CRUD)操作の実行に2つのセキュリティ・シナリオを使用できます。これらを次に示します。
ドメイン・レベルの資格証明
アプリケーション・レベルの資格証明
このリリースでは、プロキシ認証はサポートされていません。
このシナリオでは、ドメイン内のすべてのアプリケーションで共通の資格証明を使用してターゲット・システムに接続し、その資格証明で操作を実行します。アプリケーションは、ターゲット・システムにフットプリントを保持しません。
LDAPアダプタの構成ファイルadapters.os_xml
には、バックエンド・ディレクトリに接続するための資格証明およびホストとポートの詳細が含まれています。初期化時に他の資格証明を指定しない場合、アプリケーションはLDAPアダプタの構成ファイル内の資格証明を使用してターゲット・システムに接続します。
プロキシ・ユーザー(ログイン・ユーザーID)がAPIのアプリケーション・コンテキストで指定されていない場合、ArisID操作は、LDAPアダプタの構成ファイル内にある資格証明を使用して実行されます。
アプリケーションが共通の資格証明を使用して接続する場合、認可されたユーザーについてのみデータを表示したり、変更するようアプリケーション自体にセキュリティを組み込む必要があります。
例3-1 コード・サンプル: adapters.os_xml
LDAPアダプタの構成ファイルadapters.os_xml
は、バックエンド・ディレクトリへの接続にドメイン・レベルのユーザーIDと暗号化されたパスワードを使用するよう構成されています。次に示すのは、adapters.os_xml
のスニペットです。
<binddn>cn=admin</binddn> <bindpass>{OMASK}C2QXW1Nmf+s=</bindpass>
ArisID APIの初期化時、資格証明を指定しません。
Map env = new HashMap(); // Do not set UserManager.SECURITY_PRINCIPAL & SECURITY_CREDENTIALS UserManager uMgr = new UserManager(env); … … // Search Operation (with no proxy user in app context) List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>(); attrFilters.add(new PropertyFilterValue("User.FIRSTNAME", "app1", AttributeFilter.OP_CONTAINS)); attrFilters.add(new PropertyFilterValue("User.LASTNAME", "user1", AttributeFilter.OP_BGNSWITH)); Map<String, Object> appCtx = null; users = um.searchUsers(attrFilters, appCtx);
このシナリオでは、各アプリケーションでアプリケーション・レベルの資格証明を使用してターゲット・システムに接続し、その資格証明でCRUD操作を実行します。
この場合、ArisID APIの初期化時にアプリケーションのユーザーIDとパスワードを指定します。そうすると、アプリケーションはそれらの資格証明を使用してターゲット・システムに接続します。
プロキシ・ユーザーがAPIのアプリケーション・コンテキストに指定されていない場合、アプリケーションの資格証明を使用してArisID操作が実行されます。
この使用例には、次の機能があります。
各アプリケーションは、ターゲット・システムのデータの表示および更新を行うための異なる権限を持ちます。
ターゲット・システムで各アプリケーションによって行われる変更を監査できます。
例3-2 コード・サンプル: adapters.os_xml
LDAPアダプタの構成ファイルadapters.os_xml
は、バックエンド・ディレクトリへの接続にドメイン・レベルのユーザーIDと暗号化されたパスワードを使用するよう構成されています。次に示すのは、adapters.os_xml
のスニペットです。
<binddn>cn=admin</binddn> <bindpass>{OMASK}C2QXW1Nmf+s=</bindpass>
ArisID APIの初期化時、アプリケーションのユーザー資格証明を指定します。
Map env = new HashMap(); env.put(UserManager.SECURITY_PRINCIPAL, "cn=app1_user,cn=users,dc=oracle,dc=com"); env.put(UserManager.SECURITY_CREDENTIALS, "mypassword"); UserManager uMgr = new UserManager(env); … // Search Operation (with no proxy user in app context) List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>(); attrFilters.add(new PropertyFilterValue("User.FIRSTNAME", "app1", AttributeFilter.OP_CONTAINS)); attrFilters.add(new PropertyFilterValue("User.LASTNAME", "user1", AttributeFilter.OP_BGNSWITH));Map<String, Object> appCtx = null; users = um.searchUsers(attrFilters, appCtx);
デフォルトの接続/読取りタイムアウトは15秒に設定されています。たとえば、IdentityStore
のLDAP操作に15秒以上かかる場合、その操作はタイムアウトし、IGFでは次の例外が発生します。
org.openliberty.arisid.stack.ConnectionException
IdentityStore
に多数のエントリがあり、「次を含む」というフィルタを使用してページング/ソートで検索すると、これらの問合せはタイムアウトする場合があります。
タイムアウト値を0(タイムアウトなし)に設定し、プール・サイズを20まで増やすことをお薦めします。アプリケーションのプリファレンスにタイムアウト間隔がある場合は、0より大きい値を設定します。
タイムアウト間隔を構成する手順は、次のとおりです。
次のWLSTコマンドを実行し、すべてのアダプタをリストします。
listAdapters()
各アダプタに対して次のコマンドを実行し、timeout
およびmaxpoolsize
を設定します。
modifyLDAPAdapter('<ADAPTER NAME>', 'OperationTimeout', 0)
modifyLDAPAdapter('<ADAPTER NAME>', 'MaxPoolSize', 20)
WebLogic Serverを再起動します。
この項では、Identity Governance Framework ArisID Oracle JDeveloper拡張を使用してアプリケーションを開発する方法について説明します。
関連項目: 『Oracle Fusion Middleware Oracle JDeveloperインストレーション・ガイド』 |
この項では、次の項目について説明します。
ArisID APIを使用してアプリケーションを開発する場合、通常は次のタスクを実行します。
Oracle JDeveloperでのArisIDプロジェクトの作成。
CARMLファイルの作成と構成。
ArisID Beanの生成。
(オプション)マッピング・ファイルの編集。
Identity Governance Framework ArisID JDeveloper拡張は、複数の異なるパッケージに編成されています。パッケージは主に機能別に分かれています。最上位レベルでは、パッケージは、CARML概要エディタ、リレーションシップ・エディタ、マッピング・エディタ、Beanの生成およびプロジェクトの作成のためのものです。プロジェクトの作成には、プロジェクト構造の作成、プロジェクト・プロパティの管理およびCARMLファイルの作成に必要なすべてのクラスが含まれています。これらのパッケージの多くで共有される共通の要素は共通のままとされます。これは主に、共通のSwingコンポーネントとXML構造の解析/モデリングの抽象クラスです。
Identity Governance Framework ArisIDを使用するための最初のステップは、Oracle JDeveloperでプロジェクトを作成することです。Identity Governance Framework ArisID拡張をインストールすると、ArisID/IGFプロジェクトがJDevelolperのプロジェクト・ギャラリに追加されます。対応するプロジェクト・ウィザードによって、ArisIDに必要なライブラリの追加、ディレクトリ構造の作成、ArisID構成をテストするためのオプションの追加が行われます。次の図に、JDeveloperに表示されたサンプルのArisIDプロジェクトとディレクトリ構造を示します。
プロジェクトを作成する手順は、次のとおりです。
「ファイル」、「新規」の順に選択して新規ギャラリを開きます。
「カテゴリ」ツリーで「一般」を開き、「プロジェクト」を選択します。
IGF/ArisIDプロジェクトを選択して「OK」をクリックします。
「プロジェクト名」ページでプロジェクトのプロジェクト名とディレクトリを指定します。
オプションで、追加のテクノロジを「選択可能」リストから「選択済」リストに移動します。
プロジェクトJava設定ページでプロジェクトのデフォルト・パッケージ、Javaソース・パスおよび出力ディレクトリを指定します。
IGF/CARML設定の構成ページで「J2SE」または「J2EE」を指定します。
「終了」をクリックします。
属性と対話に関するアプリケーションの要件を宣言します。これらは、Client Attribute Requirements Markup Language (CARML)ファイルを使用して指定されます。CARMLエディタは、CARMLファイルの様々なフィールドを編集できるXMLエディタです。次の図に、CARMLエディタの「データ定義」セクションに表示されたサンプルCARML XMLファイルを示します。
新規CARMLファイルを作成するには、次のようにします。
「ファイル」、「新規」の順に選択して新規ギャラリを開きます。
「カテゴリ」ツリーで、「ビジネス層」ノードを開き、「セキュリティ」を選択します。
「項目」リストで、クライアント属性要件(CARML)をダブルクリックしてダイアログを開きます。
CARMLファイルの作成ダイアログで、作成するファイルの名前を指定し、「OK」をクリックします。
用意されているテンプレートを使用できます。関連付けられている説明に、各テンプレート・ファイルの詳細が示されます。
CARMLファイル・エディタの「一般」ページが表示されます。
「一般」ページの2つのフィールド(CARML一意インジケータおよびCARML説明)に値を指定します。
「データ定義」ページでアプリケーションの属性要件を指定します。エンティティを追加し、エンティティのデータ対話を指定します。
データ対話ページで、アプリケーション・ベースの対話要件を指定します。データ対話ステップで、対話タイプのフィルタを指定します。
既存のCARMLファイルを編集するには、「プロジェクト」パネルで適切なファイルをダブルクリックし、CARMLファイル用概要エディタで開きます。
CARMLファイルの編集が終了したら、アプリケーションで使用するArisID Beanを生成できます。ArisID APIに付属のスキーマ定義に従ってリレーション・ファイルを作成した場合、Beanの生成時に使用できます。
属性と対話の宣言をCARMLファイルに指定したら、対応するBeanクラスを生成してアプリケーションで使用できます。ファイルに複数のエンティティが定義されていて、エンティティ間のリレーションシップを指定する必要がある場合、リレーションシップ・ファイルを使用して指定できます。
Beanを生成するには、次のようにします。
「プロジェクト」ペインで、Beanの生成に使用するCARMLファイルを強調表示します。
右クリックしてアプリケーション・ナビゲータのCARMLファイル用コンテキスト・メニューを表示します。
ArisIDBeanの生成を選択します。
ArisIDBeanの生成ダイアログでパッケージを指定します。
リレーション・ファイルを使用する場合、リレーションの使用を選択してリレーション・ファイルを指定するか、参照します。
「OK」をクリックします。
これで、アプリケーションにこれらのBeanを組み込むことができます。
Identity Governance Framework ArisID API JDeveloper拡張では、始めにArisId Beanを作成します。これらのBeanは、他のJava Bean同様、開発者パースぺクティブです。標準のBeanのセマンティクスを使用してJavaアプリケーションから呼び出すことができます。これによって、開発者が使用するフレームワークに応じて様々な使用法が可能になります。
たとえば、ADF(オラクル社のJavaベースのWebアプリケーション・フレームワーク)を作成する場合、Beanをデータ・コントロールに変換してADFページにドラッグできます。これによって、開発者は、(検索、更新またはページでの表示用に)Beanを利用するアプリケーション同士を簡単に接続できます。コードを記述する必要はありません。
別の使用例は、アイデンティティ・データをWebサービスとしてOracle SOA Suiteから公開する開発者です。この場合、Beanには、Oracle Virtual DirectoryやOracle Directory Server Enterprise Editionなどのディレクトリ・サーバーに対するDSML問合せを使用するかわりにJavaコールアウトを使用してアクセスできます。SOAプロセス内で使用されるXML解析が少なくなるため、作成が容易になり、より効率的になります。
特定のプロトコルを意識せずにオブジェクトと属性の記述に注力することで、アイデンティティ情報のアクセスに関する開発者の生産性を向上させることができます。ArisIDにはプライバシとセキュリティが組み込まれているため、これは、セキュアで規格に準拠した方法で行われます。
Oracle実装では、CARML宣言をOracle Virtual DirectoryなどのLDAPベースのサーバーにマップします。マッピング・エディタで、CARML属性をLDAP属性、オブジェクトクラスおよび検索パラメータにマップできます。サイトのLDAPベースのサーバー用にマッピング・ファイルをカスタマイズできます。LDAPの規定は、Internet Engineering Task ForceによってRFCの2251から2256に定義されています。詳細は、http://www.ietf.org
を参照してください。
マッピング・ファイルを編集するには、次のようにします。
「プロジェクト」ペインでマッピング・ファイルを強調表示します。
ダブルクリックして、マッピング・ファイル概要エディタでファイルを開きます。
「マッピング」ページで、変更するエンティティを強調表示します。
そのエンティティ用に変更するマッピング定義を強調表示します。
必要に応じて、RDN属性、検索ベースおよび作成ベースを編集します。
オブジェクトクラス、フィルタ・オブジェクトクラス、パスワード属性および複数言語クラスを追加するには、対応する「追加」アイコンをクリックします。
変更する他のエンティティについて、ステップ3から6を繰り返します。
必要に応じて、「グローバル」ページでページング設定を変更します。
次のサンプル・アプリケーションでは、IDXユーザー/ロールBeanを使用します。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@page import="org.openliberty.arisid.*"%> <%@page import="org.openliberty.arisidbeans.*"%> <%@page import="oracle.igf.userrole.*"%> <%@page import="java.util.*"%> <%@page import="java.net.URI"%> <%!public static UserManager uMgr = null; { try { uMgr = new UserManager(null); } catch (Exception e) { e.printStackTrace(); } } %> <html> <head> <title>Search Users</title> <% String firstname = request.getParameter("firstname"); String lastname = request.getParameter("lastname"); String telephone = request.getParameter("telephone"); List<PropertyFilterValue> attrFilters = new ArrayList<PropertyFilterValue>(); attrFilters.add(new PropertyFilterValue("firstname", firstname, AttributeFilter.OP_BGNSWITH)); attrFilters.add(new PropertyFilterValue("lastname", lastname, AttributeFilter.OP_BGNSWITH)); attrFilters.add(new PropertyFilterValue("telephone", telephone, AttributeFilter.OP_CONTAINS)); List<User> subjs = uMgr.searchUsers(attrFilters); %> </head> <body> <a href="SearchUsers.html">Home</a> <center>List of Users with FirstName starting with "<%=firstname%>", LastName starting with "<%=lastname%>" and TelephoneNumber containing "<%=telephone%>"</center> <% Iterator<User> sIter = subjs.iterator(); while (sIter.hasNext()) { User subj = sIter.next(); Map<String, IAttributeValue> vals = subj.getAllAttributes(); Iterator<IAttributeValue> iter = vals.values().iterator(); %> <table border="0"> <tr> <th>Item</th> <th>Value</th> </tr> <% while (iter.hasNext()) { IAttributeValue val = iter.next(); String name = val.getNameIdRef(); String value = null; if (val.size() > 0) value = val.get(0); if (value != null) { %> <tr> <td><%=name%></td> <td><%=value%></td> </tr> <% } } %> </table> <% } %> <br> <br> <br> <a href="SearchUsers.html">Home</a> </body> </html>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <HTML> <HEAD><TITLE>Search Users</TITLE></HEAD> <BODY> <FORM METHOD=POST ACTION="SearchUsers.jsp"> First Name Starting with <INPUT TYPE=TEXT NAME=firstname SIZE=30><BR><BR> Last Name Starting with <INPUT TYPE=TEXT NAME=lastname SIZE=30><BR><BR> Telephone Number containing <INPUT TYPE=TEXT NAME=telephone SIZE=15><BR><BR> <P><INPUT TYPE=SUBMIT> </FORM> </BODY> </HTML>