9 メッセージ処理プラグインの開発

プラグインを開発することにより、サード・パーティまたはカスタムのSAML実装によってよく要求されるカスタムの要素と属性を含むSAMLメッセージを、Oracle Access Management Identity Federationが処理できるようにできます。実際には、OIFMessageProcessingPluginの機能を拡張することになります。

この章の内容は次のとおりです。

9.1 カスタムSAML要素の理解

SAMLは拡張可能なプロトコルなので、必要に応じてカスタムの要素と属性をSAMLメッセージに挿入できます。サード・パーティまたはカスタムのSAML実装が機能するには、これらの特定のカスタム要素または属性が必要になることがあります。たとえば、アイデンティティ・プロバイダ(IdP)では、メッセージのSAML拡張部分に含まれるカスタム<CompanyInfo>要素がSAMLリクエストを発行して会社の名前を提供することが必要な場合があります。Oracle Access Management Identity Federation(Identity Federation )は、OIFMessageProcessingPluginは、これらのカスタム要素を処理するように変更できます。

ノート:

Oracle Access Management環境に可能なのは1つのプラグインだけですが、プラグインで条件文ロジックを使用して、異なるメッセージに対して異なる結果をもたらすことができます。

9.2 OIFMessageProcessingPluginの拡張

OIFMessageProcessingPluginコードを拡張するには、次の手順に従います。

  1. ディレクトリを作成します。

    このチュートリアルでは、それをplugindevと呼びます。

  2. 次のサブディレクトリを作成します。

    plugindev/src/msgprocplugin

  3. 「SampleMsgProcPlugin.java」の内容を使用して、SampleMsgProcPlugin.javaを作成します。

    Oracle Access Managementは標準JDK XMLクラスをOracle固有のもので上書きし、Class.forNameを使用してSystem Class LoaderからDOMファクトリ・オブジェクトを直接取得できるようにします。

    SampleMsgProcPlugin.java

    package msgprocplugin;
     
    import java.io.*;
    import java.util.*;
    import javax.xml.parsers.*;
    import oracle.security.am.plugin.*;
    import oracle.security.fed.plugins.fed.msgprocessing.*;
    import org.w3c.dom.*;
    import org.w3c.dom.ls.*;
    import org.xml.sax.*;
    import static java.lang.System.err;
     
    public class SampleMsgProcPlugin extends OIFMessageProcessingPlugin {
     
            private boolean monitoringStatus;
     
            public ExecutionStatus process(MessageContext messageCtx) throws MessageProcessingException {
                    try {
                            String msg = "";
                            msg += "************************************\n";
                            msg += "* SAMPLE MESSAGE PROCESSING PLUGIN *\n";
                            msg += "************************************\n";
                            msg += "Partner Name: " + messageCtx.getPartnerName() + "\n";
                            msg += "Message Type: " + messageCtx.getMessageType() + "\n";
                            msg += "Message Version: " + messageCtx.getMessageVersion() + "\n";
                            msg += "User DN: " + messageCtx.getUserDN() + "\n";
                            msg += "User ID: " + messageCtx.getUserID() + "\n";
                            msg += "User ID Store: " + messageCtx.getUserIDStore() + "\n";
     
                            // Determine if this message meets our criteria for modification
                            boolean matches =
                                    "LoopbackIDP".equals("" + messageCtx.getPartnerName()) &&
                                    "SSO_AUTHN_REQUEST_OUTGOING".equals("" + messageCtx.getMessageType()) &&
                                    "SAML2.0".equals("" + messageCtx.getMessageVersion());
     
                            if (!matches)
                                    msg += "@@@@@@ CRITERIA NOT MET - SKIPPING THIS MESSAGE @@@@@@\n";
                            else {
                                     // your business logic here 
                            }
     
                            msg += "=================ENDS===================\n";
                            err.println(msg);
                            return ExecutionStatus.SUCCESS;
                    } catch (Exception e) {
                            e.printStackTrace();
                            throw handle(e);
                    }
            }
     
            @Override
            public String getDescription(){
                    return "Sample Message Processing Plugin";
            }
     
            @Override
            public Map<String, MonitoringData> getMonitoringData(){
                    return null;
            }
     
            @Override
            public boolean getMonitoringStatus(){
                    return monitoringStatus;
            }
     
            @Override
            public String getPluginName(){
                    return "SampleMsgProcPlugin";
            }
     
            @Override
            public int getRevision() {
                    return 123;
            }
     
            @Override
            public void setMonitoringStatus(boolean status){
                    this.monitoringStatus = status;
            }
    }
  4. SampleMsgProcPlugin.javaplugindev/src/msgprocpluginディレクトリに配置します。
  5. 「SampleMsgProcPlugin.java」の内容を使用して、SampleMsgProcPlugin.xmlプラグイン・マニフェストを作成します。

    このステップでプラグインの構成設定を定義しても、後からOracle Access管理コンソールを使用して変更できます。

    SampleMsgProcPlugin.xml

    <?xml version="1.0"?>
    <Plugin type="Message Processing">
      <author>John Doe</author>
      <email>donotreply@example.com</email>
      <creationDate>2015-04-16 12:53:37</creationDate>
      <description>Sample Message Processing Plugin</description>
      <configuration>
      </configuration>
    </Plugin>
    
  6. SampleMsgProcPlugin.xmlplugindev/ディレクトリに配置します
  7. 「MANIFEST.MF」の内容を使用してMANIFEST.MFファイルを作成します。

    これは、OSGiバンドル・メタデータを表します。プラグインが必要とするJavaパッケージがリストされます。

    ノート:

    Import-Packageはすべて1行ですので注意してください。

    MANIFEST.MF

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: SampleMsgProcPlugin
    Bundle-SymbolicName: SampleMsgProcPlugin
    Bundle-Version: 1
    Bundle-Activator: oracle.ateam.msgprocplugin.SampleMsgProcPlugin
    Import-Package: javax.xml.parsers,oracle.security.am.plugin,oracle.security.fed.plugins.fed.msgprocessing,org.osgi.framework;version="1.3.0",org.w3c.dom,org.w3c.dom.ls,org.xml.sax
    Bundle-RequiredExecutionEnvironment: JavaSE-1.6
    
  8. MANIFEST.MFplugindev/ディレクトリに配置します
  9. 「compile.sh」の内容を使用してcompile.shシェル・スクリプトを作成します。

    このシェル・スクリプトは、プラグインをコンパイルします。別のオプションは、ANTまたはMavenの使用です。パスDOMAIN_HOMEとSERVER_NAMEは、環境により変更する必要があります。また、JARS=はすべて1行ですので注意してください。

    ノート:

    JARS=はすべて1行ですので注意してください。

    compile.sh

    #!/bin/bash
    DOMAIN_HOME=/idmtop/config/domains/IAMAccessDomain
    SERVER_NAME=wls_oam1
     
    JARS="$(find $DOMAIN_HOME/servers/$SERVER_NAME/tmp/_WL_user/oam_server_11.1.2.0.0/ -name fed.jar -o -name oam-plugin.jar -o -name felix.jar | tr '\n' ':' | sed -e 's/:$//')"
    SRCS="$(find src -name '*.java')"
    rm -rf build
    mkdir build
    javac -d build -classpath $JARS $SRCS
    cp SampleMsgProcPlugin.xml build
    mkdir build/META-INF
    cp MANIFEST.MF build/META-INF
    cd build
    jar cvmf META-INF/MANIFEST.MF ../SampleMsgProcPlugin.jar *
    
  10. compile.shplugindev/ディレクトリに配置します
  11. compile.shを実行してSampleMsgProcPlugin.jarを作成します。

9.3 メッセージ処理プラグインのデプロイ

この手順を使用して、SampleMsgProcPlugin.jarをインポートし、アクティブ化します。

  1. 管理者としてOracle Access Managementコンソールにログインします。
  2. コンソール最上部の「アプリケーション・セキュリティ」をクリックします。
  3. 「プラグイン」セクションの下の「認証プラグイン」をクリックします。

    「認証プラグイン」画面は、すべてのOracle Access Managementプラグインを構成するために使用されます。

  4. 「プラグインのインポート」をクリックします。

    「プラグインのインポート」画面が表示されます。

  5. 「参照」をクリックし、OIFMessageProcessingPluginの拡張で作成したSampleMsgProcPlugin.jarを検索します。
  6. 「インポート」をクリックしてJARをアップロードします。
  7. 表をリフレッシュし、今インポートしたプラグインを検索します。
  8. 「選択項目の配布」をクリックします。
  9. 「リフレッシュ」アイコンをクリックして、ステータスが「配布済」に変わったことを確認します。
  10. 「選択項目のアクティブ化」をクリックします。
  11. 「リフレッシュ」アイコンをクリックして、ステータスが「アクティブ化済」に変わったことを確認します。

これでプラグインがインストールされ、アクティブ化されました。

9.4 メッセージ処理プラグインの有効化

この手順を使用して、SampleMsgProcPlugin.jarが使用できる状態であることをIdentity Federationに知らせます。

  1. ファイル$DOMAIN_HOME/config/fmwconfig/oam-config.xmlをテキスト・エディタで開きます。
  2. fedserverconfigタグの名前が付けられた設定の下で定義されている、messageprocessingepluginタグの名前が付けられた設定を見つけます。
  3. messageprocessingepluginの値を、プラグインの名前に変更します。
  4. fedserverconfigタグの名前が付けられた設定の下で定義されている、messageprocessingenabledタグの名前が付けられた設定を見つけます。
  5. messageprocessingenabledの値を、falseからtrueに変更します。
  6. Versionという名前の設定を見つけ(ファイルの上の方)、バージョン番号をインクリメントします。

    oam-config.xmlファイルが変更されたら毎回これを実行します。

  7. ファイルを保存します。

    同じディレクトリにあるoam-config.refファイルのバージョン番号が新しいバージョン番号に増やされていれば、変更が読み込まれています。