Liberty リポジトリー[8.5.5.6 以降]

Java Authorization Contract for Containers (JACC) 許可プロバイダーの開発

Liberty プロファイル・サーバーで提供されている com.ibm.wsspi.security.authorization.jacc.ProviderService インターフェースを実装することによって、 Java™™ Platform, Enterprise Edition (J2EE) アプリケーションのカスタム許可決定を行う JACC プロバイダーを開発できます。

始める前に

デフォルトでは、アプリケーション・モジュールのロードはアプリケーションへの要求が処理されるようになるまで据え置かれますが、 アプリケーション内のモジュール全体のセキュリティー制約は、アプリケーションが処理される準備ができる前に処理される必要があります。モジュールのロードの据え置きは無効にされる必要があります。以下に、無効にする方法を示します。
  1. Web コンテナーの場合:
    server.xml ファイル内に以下のエレメントが設定される必要があります。
    <webContainer deferServletLoad="false"/>
  2. EJB コンテナーの場合:
    server.xml ファイル内に以下のエレメントが設定される必要があります。
    <ejbContainer startEJBsAtAppStart="true"/>
注: 上記のエレメントが設定されていない場合、 サーバー開始時にサード・パーティー JACC プロバイダーにセキュリティー制約情報が完全には伝搬されない可能性があります。その結果、サード・パーティー JACC プロバイダーが正しい許可決定を行えなくなることがあります。

このタスクについて

Java Authorization Contract for Containers 仕様 JSR 115 は許可プロバイダー用のインターフェースを定義しています。Liberty プロファイル・サーバーで、JACC プロバイダーをユーザー・フィーチャーとしてパッケージする必要があります。そのフィーチャーは com.ibm.wsspi.security.authorization.jacc.ProviderService インターフェースを実装する必要があります。

手順

  1. com.ibm.wsspi.security.authorization.jacc.ProviderService インターフェースを実装するサービスを提供する OSGi コンポーネントを作成します。

    ProviderService インターフェースは、2 つのメソッドを定義します。 1 つは getPolicy であり、Liberty プロファイル・ランタイムはこのメソッドを呼び出して、java.security.Policy 抽象クラスを実装する Policy クラスのインスタンスを取得します。 もう 1 つは getPolicyConfigFactory であり、Liberty プロファイル・ランタイムはこのメソッドを呼び出して、javax.security.jacc.PolicyConfigurationFactory 抽象クラスを実装する PolicyConfigurationFactory クラスのインスタンスを取得します。

    以下の例では、OSGi 宣言型サービスのアノテーションが使用されています。
    @package com.mycompany.jacc;
    
    import com.mycompany.jacc.MyAuthConfigProvider;
    import com.ibm.wsspi.security.authorization.jacc.ProviderService;
    
    // The property value of javax.security.jacc.policy.provider which defines the implementation class of Policy and
    // javax.security.jacc.PolicyConfigurationFactory.provider which defines the implementation class of PolicyConfigurationFactory, are required for propagating the properties to the Liberty runtime.
    
    @Component(service = ProviderService.class,
               immediate = true,
               property = {
                           "javax.security.jacc.policy.provider
                             =com.mycompany.jacc.MyPolicy",
                           "javax.security.jacc.PolicyConfigurationFactory.provider
                             =com.mycompany.jacc.MyPolicyConfigurationFactoryImpl"
                          }
              )
    public class MyJaccProviderService implements ProviderService {
    // This method called by the Liberty profile runtime
        // to get an instance of Policy class
        @Override
        public Policy getPolicy() {
            return new myPolicy();
        }
    
        // This method called by the Liberty profile runtime
        // to get an instance of PolicyConfigurationFactory class
        @Override
        public Policy getPolicyConfigurationFactory() {
            ClassLoader cl = null;
            PolicyConfigurationFactory pcf = null;
            System.setProperty(JACC_FACTORY, JACC_FACTORY_IMPL);
            try {
                cl = Thread.currentThread().getContextClassLoader();
                Thread.currentThread().setContextClassLoader(
                                  this.getClass().getClassLoader());
                pcf = PolicyConfigurationFactory.getPolicyConfigurationFactory();
            } catch (Exception e) {
                return null;
            } finally {
                Thread.currentThread().setContextClassLoader(cl);
            }
            return pcf;
        }
    
        protected void activate(ComponentContext cc) {
            // Read provider config properties here if needed,
            // then pass them to the Provider ctor.
            // This example reads the properties from the OSGi
            // component definition.
            configProps = (MapString, String) cc.getProperties();
        }
    
        protected void deactivate(ComponentContext cc) {}
    }
  2. このコンポーネントを、ユーザー・フィーチャーの一部である OSGi バンドルに、JACC プロバイダーと一緒にパッケージします。
  3. フィーチャーには OSGi サブシステム・コンテンツを必ず含めてください: com.ibm.ws.javaee.jacc.1.5; location:="dev/api/spec/"
  4. フィーチャーがユーザー製品拡張ロケーションにインストールされた後、 そのフィーチャー名を指定して server.xml ファイル を構成します。以下に例を示します。
    <featureManager>
       ...
       <feature>usr:myJaccProvider</feature>
    </featureManager>

トピックのタイプを示すアイコン タスク・トピック

インフォメーション・センターに関するご使用条件 | フィードバック


タイム・スタンプ・アイコン 最終更新: 2015 年 6 月 17日
http://www14.software.ibm.com/webapp/wsbroker/redirect?version=phil&product=was-libcore-mp&topic=twlp_developing_jacc_auth_provider
ファイル名: twlp_developing_jacc_auth_provider.html