SOAコンポジットで標準のペイロード・データに加えて使用されるデータがビジネス・プロセスに必要な場合は、Java埋込みステップを使用して、リクエスタ、受益者またはリクエスト内容に関する詳細を取得できます。
この章では、SOAコンポジットからのOracle Identity Manager APIの使用方法について次の項で説明します。
Oracle Identity Manager APIをSOAコンポジットからロードするようSOAサーバーを構成する前に、次の手順を実行します。
Oracle Identity Managerデプロイメントと互換性のあるバージョンのJDeveloperをインストールします。また、JDeveloperがSOAコンポジットと連携して正しく動作するよう、JDeveloperのパッチをインストールします。
OIM_HOMEがOracle Identity Managerのインストール・ディレクトリを指していることを確認します。たとえば、/scratch/shiphome/beahome/Oracle_IDM1/server/はOIM_HOMEを指している必要があります。
このドキュメントでは、OIM_HOMEはOracle Identity Managerがデプロイされているディレクトリを指しています。たとえば、/scratch/shiphome/beahome/Oracle_IDM1/はOIM_HOMEを指している必要があります。
この項では、必要なJavaコードをコンポジットに導入してSOAサーバーにデプロイするために、JDeveloperおよびSOAコンポジットで必要となる構成について説明します。
この項には次のトピックが含まれます:
Oracle Identity Managerがインストールされているアプリケーション・サーバーの新しい接続がJDeveloperで設定されていることを確認します。次の手順を実行する前に、WebLogic管理サーバーおよびSOAサーバーが実行中であることを確認します。
アプリケーション・サーバーの新規接続を設定するには、次の手順を実行します。
「ファイル」メニューから、「新規」を選択します。「新規ギャラリ」ダイアログ・ボックスが表示されます。
左側のメニューから、「すべての項目」を選択します。右側のペインで、「アプリケーション・サーバー接続」を選択してから、「OK」をクリックします。アプリケーション・サーバー接続の作成ウィザードが表示されます。
「名前とタイプ」ウィンドウで、JDeveloperでアプリケーション・サーバーを識別する名前を入力します。接続タイプとして「Weblogic 10.3」を選択して、「次へ」をクリックします。
「認証」ウィンドウで、WebLogicユーザーのユーザー名およびパスワードを指定します。「次へ」をクリックします。
「構成」ウィンドウで、SOA管理対象サーバーが実行中のホスト名、ポート番号およびWebLogicドメイン名を入力します。ポートはWebLogic管理サーバーのポート(通常は7001)である必要があります。「次へ」をクリックします。
「テスト」ウィンドウで、「接続のテスト」をクリックして入力したすべての情報が正しいことを確認します。テストが成功のステータスでパスします。「次へ」をクリックします。
「終了」をクリックして、ウィザードを終了します。これにより、アプリケーション・サーバーへの接続が作成されます。この接続は、すべての変更を行った後でコンポジットをサーバーにデプロイするために必要です。
JDeveloperで編集用にSOAコンポジットを設定するには、次の手順を実行します。
DefaultRequestApproval.zipファイルをOIM_HOME/workflows/composites/ディレクトリからJDeveloperの作業ディレクトリにコピーします。同じディレクトリでそれを解凍して、DefaultRequestApprovalディレクトリを作成します。
デフォルト・ロールでJDeveloperを起動します。
「ファイル」メニューから、「開く」を選択します。ファイルを開くためのダイアログ・ボックスが表示されます。DefaultRequestApprovalディレクトリのDefaultRequestApproval.jprファイルを選択します。これにより、JDeveloperでコンポジットが開きます。プロジェクト・ファイルの作成時には、「OK」または「はい」をクリックします。
コンポジットに書き込むJavaコードを正常にコンパイルするには、oimclient.jarファイルがJDeveloperのコンポジットのコピーに存在している必要があります。oimclient.jarファイルをOIM_HOME/server/client/ディレクトリからJDEVELOPER_WORKING_DIRECTORY/DefaultRequestApproval/SCA-INF/lib/ディレクトリにコピーします。このディレクトリは、編集中のコンポジットのlib/ディレクトリです。
関連項目: JDeveloperにおけるSOAコンポジットの設定の詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle JDeveloperにおける単一のSOAコンポジットのデプロイに関する説明を参照してください。 |
JDeveloperでSOAコンポジットを編集するには、次の手順を実行します。
左側のペインで、「プロジェクト」タブをクリックします。
DefaultRequestApprovalプロジェクトの下で、ApprovalProcess.bpelファイルを選択して開きます。これにより、承認ワークフローが表示されます。
右側のペインの「コンポーネント・パレット」で、「Java埋込み」タスクを選択し、ワークフローのreceiveInputタスクの後でApprovalTask_1ヒューマン・タスクの前にドラッグ・アンド・ドロップします。これにより、Java_Embedding_1と呼ばれる新規タスクが作成されます。必要に応じて、名前をInvoke_OIM_APIに変更できます。
Invoke_OIM_API Javaタスクをダブルクリックします。これによりエディタが開き、必要なJavaコードを追加できます。例26-1に示すように、Javaコードを追加します。
例26-1 埋込みJavaソース・コード
try { System.out.println("Prototype for invoking an OIM API from a SOA Composite"); System.out.println("RTM Usecase: Organization Administrator"); String oimUserName = ""; String oimPassword = ""; String oimURL = ""; String roleApprover = ""; String actKey = ""; //get oimuser credentials oracle.security.jps.JpsContext ctx = oracle.security.jps.JpsContextFactory.getContextFactory().getContext(); final oracle.security.jps.service.credstore.CredentialStore cs = (oracle.security.jps.service.credstore.CredentialStore) ctx.getServiceInstance(oracle.security.jps.service.credstore.CredentialStore.class); oracle.security.jps.service.credstore.CredentialMap cmap = cs.getCredentialMap("oracle.oim.sysadminMap "); oracle.security.jps.service.credstore.Credential cred = cmap.getCredential("sysadmin"); if (cred instanceof oracle.security.jps.service.credstore.PasswordCredential) { oracle.security.jps.service.credstore.PasswordCredential pcred = (oracle.security.jps.service.credstore.PasswordCredential)cred; char[] p = pcred.getPassword(); oimUserName = pcred.getName(); oimPassword = new String(p); } //get oimurl Object obj = getVariableData("oimurl"); oimURL = obj.toString(); // set the initial context factory String oimInitialContextFactory = "weblogic.jndi.WLInitialContextFactory"; // set up the environment for making the OIM API invocation java.util.Hashtable env = new java.util.Hashtable(); env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_FACTORY_INITIAL, oimInitialContextFactory); env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_PROVIDER_URL, oimURL); oracle.iam.platform.OIMClient client = new oracle.iam.platform.OIMClient(env); client.login(oimUserName, oimPassword.toCharArray()); System.out.println("Login Successful"); // get Service oracle.iam.request.api.RequestService reqSvc = client.getService(oracle.iam.request.api.RequestService.class); oracle.iam.identity.rolemgmt.api.RoleManager roleSvc = client.getService(oracle.iam.identity.rolemgmt.api.RoleManager.class); oracle.iam.identity.usermgmt.api.UserManager usersvc = client.getService(oracle.iam.identity.usermgmt.api.UserManager.class); Object reqIdXMLElem = getVariableData("inputVariable", "payload", "/ns3:process/ns4:RequestID"); String reqId = ((oracle.xml.parser.v2.XMLElement)reqIdXMLElem).getText(); System.out.println("The request ID is "+reqId); // invoke the getBasicRequestData() method on the RequestService API oracle.iam.request.vo.Request req = reqSvc.getBasicRequestData(reqId); java.util.List<oracle.iam.request.vo.Beneficiary> beneficiaries = req.getBeneficiaries(); if(beneficiaries != null){ for(oracle.iam.request.vo.Beneficiary benf: beneficiaries){ //get org key java.util.HashSet<String> searchAttrs = new java.util.HashSet<String>(); searchAttrs.add(oracle.iam.identity.usermgmt.api.UserManagerConstants. AttributeName.USER_LOGIN.getId()); searchAttrs.add(oracle.iam.identity.usermgmt.api.UserManagerConstants. AttributeName.USER_ORGANIZATION.getId()); oracle.iam.identity.usermgmt.vo.User user1 = usersvc.getDetails(benf.getBeneficiaryKey(),searchAttrs, false); actKey = user1.getAttribute("act_key").toString(); //get org admin if(actKey != "" && actKey != " ") { Thor.API.Operations.tcOrganizationOperationsIntf orgAPI = (Thor.API.Operations.tcOrganizationOperationsIntf)client.getService( Thor.API.Operations.tcOrganizationOperationsIntf.class); Thor.API.tcResultSet rset = orgAPI.getAdministrators(Long.parseLong(actKey)); StringBuffer sb = new StringBuffer(); for (int i = 0; i < rset.getRowCount();i++){ rset.goToRow(i); sb.append(rset.getStringValue("Groups.Group Name")) ; if(i >= 0 && i < (rset.getRowCount()-1)){ sb.append(","); } } String grpNames = sb.toString(); System.out.println("Groups="+grpNames); setVariableData("orgAdmin",grpNames); } //get role approver java.util.List<oracle.iam.request.vo.RequestBeneficiaryEntity> rbes = benf.getTargetEntities(); for(oracle.iam.request.vo.RequestBeneficiaryEntity rbe : rbes){ String key = rbe.getEntityKey(); String type = rbe.getEntityType(); if(type.equalsIgnoreCase("Role")){ java.util.HashSet<String> roleAttrs = new java.util.HashSet<String>(); roleAttrs.add("Role Approver"); oracle.iam.identity.rolemgmt.vo.Role role = roleSvc.getDetails(key,roleAttrs); roleApprover = (String)role.getAttribute("Role Approver"); setVariableData("roleApprover", roleApprover); break; } } break; } } System.out.println("OrgAdmin=" + getVariableData("orgAdmin").toString()); System.out.println("roleApprover=" + getVariableData("roleApprover").toString()); } catch (Exception e){ System.out.println("----------------------"); e.printStackTrace(); System.out.println("----------------------"); }
例26-1では、Oracle Identity Manager APIを使用して組織管理者を取得するために、Javaコードで次のことが実行されます。
システム管理者の資格証明を取得します。
システム管理者の資格証明は、資格証明ストア(cwallet)に格納されています。最初に資格証明ストア、次に資格証明マップ、その次に資格証明がキーを使用して取得されます。次のコードの抜粋にこれを示します。
//get Credential store oracle.security.jps.JpsContext ctx = oracle.security.jps.JpsContextFactory.getContextFactory().getContext(); final oracle.security.jps.service.credstore.CredentialStore cs = (oracle.security.jps.service.credstore.CredentialStore)ctx.getServiceInstance( oracle.security.jps.service.credstore.CredentialStore.class); //get Credential oracle.security.jps.service.credstore.CredentialMap cmap = cs.getCredentialMap("oracle.oim.sysadminMap"); oracle.security.jps.service.credstore.Credential cred = cmap.getCredential("sysadmin");
システム管理者としてログインします。
環境が設定されたら、Oracle Identity Managerにシステム管理者としてログインします。次のコードの抜粋にこれを示します。
//setup the environment String oimInitialContextFactory = "weblogic.jndi.WLInitialContextFactory"; java.util.Hashtable env = new java.util.Hashtable(); env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_FACTORY_INITIAL, oimInitialContextFactory); env.put(oracle.iam.platform.OIMClient.JAVA_NAMING_PROVIDER_URL, oimURL); //login to OIM oracle.iam.platform.OIMClient client = new oracle.iam.platform.OIMClient(env); client.login(oimUserName, oimPassword.toCharArray()); System.out.println("Login Successful");
組織管理者およびロール承認者を取得します。
これを行うには、次のOracle Identity Manager APIを使用します。
oracle.iam.request.api.RequestService: リクエスト・オブジェクトを取得するために使用します。
Thor.API.Operations.tcOrganizationOperationsIntf: 組織管理者を取得するために使用します。
oracle.iam.identity.usermgmt.api.UserManager: ロール承認者を取得するために使用します。
関連項目: Oracle Identity Manager APIの詳細は、Oracle Fusion Middleware Oracle Identity Manager Java APIリファレンスを参照してください。 |
SOAコンポジットをデプロイする前に、Enterprise Managerの「システムMBeanブラウザ」で、BPELClasspathプロパティを設定します。
コンポジットを更新後、コンポジットをSOAにデプロイする必要があります。これを行うには、次の手順を実行します。
「プロジェクト」セクションでコンポジット名を右クリックし、「デプロイ」を選択します。
DefaultRequestApproval ...オプションを選択します。ウィザードが表示され、コンポジットをデプロイするアプリケーション・サーバーを選択するよう要求されます。以前に作成したアプリケーション・サーバー接続を選択します。また、すでにデプロイされているコンポジットを上書きする場合は、同じリビジョンIDで既存のコンポジットを上書きします。オプションを選択します。
コンポジットをデプロイ後、コンポジットを再登録するか、またはOracle Identity Manager側からコンポジットを無効化して有効化します。これは、Oracle Identity Managerによってコンポジットが正しく起動できることを確認するために行います。
関連項目: SOAコンポジットのデプロイの詳細は、『Oracle Fusion Middleware Oracle SOA Suite開発者ガイド』のOracle JDeveloperにおける単一のSOAコンポジットのデプロイに関する説明を参照してください。 |
SOAコンポジットを更新後、コンポジットへの変更をテストして、Oracle Identity Manager APIがロードされていることを確認できます。JavaコードはSOAコンポジットに(ワークフローのヒューマン・タスクの前に)追加されているため、リクエスト承認がSOAで開始されるとすぐに実行されます。
リクエストを作成してJavaコードをテストするには、次の手順を実行します。
Oracle Identity Manager管理およびユーザー・コンソールにログインします。
「拡張」をクリックして拡張管理に移動します。
「管理」の下の「ようこそ」ページで、「リクエスト」をクリックします。または、「管理」タブをクリックしてから「リクエスト」をクリックします。
「アクション」メニューから、「リクエストの作成」を選択します。または、ツールバーの「リクエストの作成」アイコンをクリックします。リクエスト作成ウィザードが表示されます。
注意:
|
「リクエストのタイプ」リストから、「ユーザーの作成」を選択します。次に、「次へ」をクリックします。
「詳細の入力」ページで、フィールドにサンプル値を入力してユーザーを作成します。次に、「次へ」をクリックします。
「確認」ページで、「終了」をクリックします。
SOAサーバー・コンソールで、埋め込まれたJavaコードからの出力を監視します。「終了」をクリックすると、SOAコンポジットが実行されます。SOAサーバー・コンソールに、次のテキストが表示されます。
Prototype for invoking an Oracle Identity Manager API from a SOA Composite Login Successful <Request ID and other request data>
コードが正常に実行されると、この出力が表示されます。