プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle Web Services Manager拡張可能アプリケーションの開発
12c (12.2.1.3.0)
E90308-02
目次へ移動
目次

前
次

4 カスタム・アサーションの高度な機能の実装

Oracle Web Services Manager Java APIリファレンスを使用すると、カスタム・アサーションに高度な機能を実装するためのパッケージ、インタフェースおよびメソッドの詳細を確認できます。

この章では、いくつかの一般的な機能と例外処理を実装するために、このAPIを使用する方法について説明します。この付録の内容は次のとおりです。

4.1 カスタム・アサーションのパラメータの指定

IAssertionBindings、IConfig、IPropertySet、getBindings、getConfigs、getPropertySets、getPropertyByNameおよびgetValueなどの様々なインタフェースおよびメソッドを使用して、カスタム・アサーション・エグゼキュータ内のパラメータにアクセスできます。

カスタム・アサーションのパラメータを指定する方法の段階的な手順は、「カスタム・アサーションへのパラメータの入力」を参照してください。

4.1.1 カスタム・アサーションへのパラメータの入力

カスタム・エグゼキュータの内部のパラメータを指定し、それにアクセスすることで、カスタム・アサーションにパラメータを入力できます。

カスタム・アサーションにパラメータを入力するには:

  1. カスタム・アサーション内部に、パラメータをプロパティとして指定します。この例では、valid_ipsという名前が付いたorawsp:PropertySetがプロパティのグループを定義します。orawsp:Property要素は単一のプロパティを定義します。orawsp:Valueではプロパティの有効な値のリストを定義します。
    <orawsp:PropertySet orawsp:name="valid_ips">
        <orawsp:Property orawsp:name="valid_ips" orawsp:type="string"
     orawsp:contentType="constant">
         <orawsp:Value>140.87.6.143,10.178.93.107</orawsp:Value>
         </orawsp:Property>
     </orawsp:PropertySet>
    
  2. 対応するポリシーのカスタム・エグゼキュータ内部のパラメータにアクセスします。たとえば、カスタム・アサーションのExecutorクラスの実行メソッドの次のコードは、プロパティvalid_ipsにアクセスします。
    IAssertionBindings bindings =
     ((SimpleAssertion)(this.assertion)).getBindings();
    IConfig config = bindings.getConfigs().get(0);
    IPropertySet propertyset = config.getPropertySets().get(0);   
    String valid_ips = propertyset.getPropertyByName("valid_ips").getValue();

4.2 OWSMコンテキスト・プロパティの検査

IMessageContextインタフェースを使用してOWSMコンテキスト・プロパティにアクセスできます。

次に、インタフェースとメソッドの一覧を示します。

  • IMessageContext

  • getServiceURL

  • getProperty

  • getAllProperty

IMessageContextインタフェースを使用したプロパティへのアクセス方法の手順は、「OWSMコンテキスト・プロパティへのアクセス」を参照してください。

4.2.1 OWSMコンテキスト・プロパティへのアクセス

IMessageContextインタフェースを使用して様々な方法でOWSMコンテキスト・プロパティにアクセスできます。

OWSMコンテキスト・プロパティにアクセスするには:

  1. カスタム・アサーション・エグゼキュータ内部のOWSMコンテキスト・プロパティにアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。
    IMessageContext messagecontext = (IMessageContext) context;         
    messagecontext.getServiceURL();
    
  2. カスタム・アサーション・エグゼキュータ内部にある特定のプロパティの値にアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。

    messagecontext.getProperty("<property name>");

  3. カスタム・アサーション・エグゼキュータ内部から実行中に使用されるすべてのプロパティにアクセスするには、IMessageContextインタフェースを使用します。次に例を示します。

    msgContextProperties = messagecontext.getAllProperties();

4.3 OWSMカスタム・セキュリティ・アサーションへのアクセス

様々なインタフェースを使用して、カスタム・アサーション・エグゼキュータの内部でステージにアクセスし、リクエスト・メッセージとレスポンス・メッセージを取得できます。

OWSMカスタム・セキュリティ・アサーションには、3つのステージがあります。

  • リクエスト: クライアントがリクエストを実行し、そのリクエストがリクエスト先に配信中であるときに、リクエスト・ステージが発生します。

  • レスポンス: リクエスト先がメッセージを処理し、レスポンスを返しているときに、レスポンス・ステージが発生します。

  • フォルト: フォルトの場合に、フォルト・ステージが発生します。

コンテキスト情報(ステージやメッセージなど)はコンテキスト・プロパティを使用して渡され、IMessageContextインタフェースによって取得されます。コンテキスト・プロパティへのアクセスに使用できるインタフェースとメソッドは、次のとおりです。

  • IMessageContext

  • getStage

  • getRequestMessage

  • getResponseMessage

カスタム・セキュリティ・アサーション・ステージおよびインタフェースにアクセスする方法の手順は、「リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセス」を参照してください。

4.3.1 リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトへのアクセス

リクエスト、レスポンスおよびフォルト・メッセージ・オブジェクトにアクセスするには:

  1. ステージにアクセスするには、カスタム・アサーション・エグゼキュータ内で次のコードを使用します。
    IMessageContext.STAGE stage = ((IMessageContext) iContext).getStage();
               if (stage == IMessageContext.STAGE.request) {
                         //handle request
                }
                
                if (stage == IMessageContext.STAGE.response) {
                       //handle response
                }
                
                if (stage == IMessageContext.STAGE.fault) {
                    //handle fault conditions
                }
  2. SOAPリクエスト・メッセージを取得するには、次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用します。
    oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
     (oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
    javax.xml.soap.SOAPMessage soapMessage = soapMsgCtxt.getRequestMessage();
    
  3. SOAPレスポンス・メッセージを取得するには、次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用します。
    oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
     (oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
    javax.xml.soap.SOAPMessage soapMessage = soapMsgCtxt.getResponseMessage ();

4.4 XPathによるメッセージのパーツへのアクセス

XPath式を使用すると、カスタム・アサーション・エグゼキュータの内部で、SOAPメッセージのパーツにアクセスできます。

次の各トピックで、さらに詳しく説明します。

4.4.1 XPath式について

カスタム・ポリシー・エグゼキュータ内のXPath式を使用して、SOAPメッセージのパーツにアクセスできます。

次のSOAPメッセージ例では、ノードarg0の値はjohnです。

         <S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
           <S:Header/>
             <S:Body>
               <ns2:echo xmlns:ns2="http://project1/">
                <arg0>john</arg0>
               </ns2:echo>
             </S:Body>
         </S:Envelope>

XPathには、要素、属性、テキスト、ネームスペース、処理の指示、コメントおよびドキュメント・ノードの7種類のノードがあります。XPathでは、パス式を使用してXMLドキュメントのノードを選択します。表4-1は、XPath式の例を示しています。

表4-1 XPath式の例

説明

/S:Envelope

ルート要素S:Envelopeから選択します。

/S:Envelope/S:Body

S:Envelopeの子であるすべてのS:Body要素を選択します。

//S:Body

ドキュメント内のどこにあっても、すべてのS:Body要素を選択します。

4.4.2 ノードの値の特定

XPath式を使用してノードarg0の値を特定するには、次の例を参照してください。

次に、例を示します。

//xpath expression that will be used to identify the node arg0
     String xpathStr = "/S:Envelope/S:Body/ns2:echo/arg0";
 

4.4.3 名前空間コンテキストへの名前空間の追加

XPath式が参照するいずれかの名前空間に名前空間を定義して、その名前空間コンテキストに追加できます。

次に例を示します。

     final DefaultNamespaceContext nsContext = new DefaultNamespaceContext();
     nsContext.addEntry("S", "http://schemas.xmlsoap.org/soap/envelope/");
     nsContext.addEntry("ns2", "http://project1/");
              
     XPathFactory xpathFact = XPathFactory.newInstance();
     XPath xpath = xpathFact.newXPath();
     xpath.setNamespaceContext(nsContext);

4.4.4 ノードの値の取得

evaluateメソッドを使用してノードの値を取得するには、次の例を参照してください。

次に、例を示します。

     //This will return node arg0 from SOAP message, here soapElement is  
// org.w3c.dom.Elemet  representation of SOAP message
     org.w3c.dom.Node inputNode = (Node)xpath.evaluate(xpathStr, soapElement,
 XPathConstants.NODE);

4.5 SSLのコンテナで使用される証明書の取得

oracle.wsm.common.sdk.IMessageContextを使用して証明書の属性にアクセスすることで、SSLの証明書を取得できます。

SSLの証明書を取得するには:

  1. 次の例に示すように、同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用して、SOAPレスポンス・メッセージを取得します。
    oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt=
     (oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
                 
  2. X.509証明書の属性にアクセスします。次に例を示します。
    X509Certificate[] certificates = (X509Certificate[])
    soapMsgCtxt.getTransportContext().getAttribute(oracle.wsm.security.util.SecurityConstants.SSL_PEER_CERTIFICATES);
    

4.6 トランスポート・プロパティへのアクセス

次の例に示したものと同じメッセージ・コンテキストを使用し、メッセージ・コンテキストからTransportContextを取得することで、HTTPリクエストとHTTPレスポンスのトランスポート・プロパティにアクセスできます。

HTTPリクエストとHTTPレスポンスのトランスポート・プロパティにアクセスするには:

  1. 同じコンテキストのoracle.wsm.common.sdk.IMessageContextを使用してSOAPレスポンス・メッセージを取得します。次に例を示します。
    oracle.wsm.common.sdk.SOAPBindingMessageContext soapMsgCtxt= (oracle.wsm.common.sdk.SOAPBindingMessageContext) context;
    
  2. メッセージ・コンテキストからTransportContextを取得します。次に例を示します。
    ITransportContext transCtx = invokerCtx.getTransportContext();
    

    各種のプロパティにアクセスする方法については、Oracle Fusion Middleware Oracle Web Services Manager Java APIリファレンスで、javadocクラスのITransportContextHttpTransportContextを参照してください。これらのクラスについての情報は、oracle.wsm.common.sdkパッケージ内で入手できます。

4.7 資格証明ストア・フレームワークのキーへのアクセス

資格証明ストア・フレームワーク(CSF)を使用して、資格証明を安全に管理し、資格証明を保存、取得および維持できます。

CSFを構成して使用するには:

  1. jps-config.xmlでCSFを構成します。

    WLSTを使用した資格証明ストアの構成方法の詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の資格証明ストアの構成に関する項を参照してください。

  2. カスタム・アサーション・エグゼキュータ内部のCSFからCSFキーを追加、更新または取得できます。

    次のサンプルを使用すると、資格証明ストアからCSFのキーにアクセスできます。

       final String mapName = "oracle.wsm.security";
       final csfKey = "user.credentials";
       final oracle.security.jps.service.credstore.PasswordCredential userCreds =
     getCredentialsFromCSF(mapName, csfKey);
     
              if (userCreds != null) {
                    System.out.println("name:"+ userCreds.getName());
                    System.out.println("name:"+ new String(userCreds.getPassword()));
                                      }
        

    このサンプルでは、getCredentialsFromCSFメソッドを使用しています。

    private static oracle.security.jps.service.credstore.PasswordCredential 
    getCredentialsFromCSF(
            final String mapName, final String csfKey) {
            oracle.security.jps.service.credstore.PasswordCredential
            passwordCredential = null;
            try {
                if (csfKey != null) {
                final oracle.security.jps.service.credstore.CredentialStore credStore
                = getCredStore();
                if (credStore != null) {
                passwordCredential = (oracle.security.jps.service.credstore.PasswordCredential)  java.security.AccessController
                .doPrivileged(new
    java.security.PrivilegedExceptionAction<oracle.security.jps.service.credstore.
    Credential>() { 
                 public
     oracle.security.jps.service.credstore.Credential run() throws Exception {
                  return (credStore .getCredential(mapName, csfKey));
                                }
                            });
                    } else {
                        // failure obtaining csf credentials
                    }
                }
            } catch (final java.security.PrivilegedActionException ex) {
                //handle excpetion
            } catch (final oracle.security.jps.JpsException jpse) {
                //handle excpetion
            }
            return passwordCredential;
        }
     
     
        private static oracle.security.jps.service.credstore.CredentialStore
     getCredStore() throws oracle.security.jps.JpsException {
            oracle.security.jps.service.credstore.CredentialStore csfStore;
            oracle.security.jps.service.credstore.CredentialStore appCsfStore = null;
            oracle.security.jps.service.credstore.CredentialStore systemCsfStore =
     null;
     
            final oracle.security.jps.internal.api.runtime.ServerContextFactory
     factory = (oracle.security.jps.internal.api.runtime.ServerContextFactory)
     oracle.security.jps.JpsContextFactory
                .getContextFactory();
     
            final oracle.security.jps.JpsContext jpsCtxSystemDefault =
     factory.getContext(oracle.security.jps.internal.api.runtime.ServerContextFactory.S
    cope.SYSTEM);
     
            final oracle.security.jps.JpsContext jpsCtxAppDefault = factory
                .getContext(oracle.security.jps.internal.api.runtime.ServerContextFactory.Scope.AP
    PLICATION);
     
            appCsfStore = (jpsCtxAppDefault != null) ? jpsCtxAppDefault
                .getServiceInstance(oracle.security.jps.service.credstore.CredentialStore.class) :
     null;
     
            if (appCsfStore == null) {
                systemCsfStore = jpsCtxSystemDefault
                    .getServiceInstance(oracle.security.jps.service.credstore.CredentialStore.class);
                csfStore = systemCsfStore;
            } else {
                //use Credential Store defined in app-level jps-config.xml
                csfStore = appCsfStore;
            }
            return csfStore;
        }
    

注意:

JARファイルoracle.jps_12.1.2/jps-api.jar、oracle.jps_12.1.2/jps-unsupported-api.jarがclasspathに含まれている必要があります。

カスタム・ポリシー・エグゼキュータのjarに対して、CredentialAccessPermission権限を指定する必要があります。権限付与の詳細は、『Oracle Platform Security Servicesによるアプリケーションの保護』のJavaセキュリティ・ポリシーの権限の設定関する項を参照してください。

4.8 カスタム・アサーションでの例外処理

カスタム・アサーション・エグゼキュータでWSMExceptionメソッドを使用して例外を処理できます。

詳細は、以下のトピックを参照してください。

4.8.1 WSMExceptionメソッドについて

カスタム・アサーション実行中の例外は、すべてWSMExceptionがカスタム・アサーション・エグゼキュータで処理する必要があります。

IResult execute(IContext mcontext) throws WSMException

このメソッドは、常に、null以外のIResultオブジェクトを返します。ステータス・フィールドは、成功、失敗または他の状態を示します。IResult.getFault()メソッドは失敗の詳細な原因を返すために使用され、成功の場合はnullを返します。

4.8.2 WSMExceptionでの例外処理

カスタム・アサーション・エグゼキュータのexecuteメソッド内で発生する例外は、まず、WSMExceptionでラップして、実行ステータスをIResult.FAILEDに設定し、generateFaultメソッドでWSMExceptionをスローする必要があります。

この例を次に示します。

IResult execute(IContext mcontext) throws WSMException {
   IResult result = new Result();
   try {
      ....
      .....
 
   } catch (Exception e) {
      WSMException wsmException = new WSMException(e);
      result.setStatus(IResult.FAILED);
      generateFault(wsmException);
   }
}