Liberty プロファイル・サーバーで提供されている com.ibm.wsspi.security.authorization.jacc.ProviderService インターフェースを実装することによって、
Java™™ Platform,
Enterprise Edition (J2EE) アプリケーションのカスタム許可決定を行う JACC プロバイダーを開発できます。
始める前に
デフォルトでは、アプリケーション・モジュールのロードはアプリケーションへの要求が処理されるようになるまで据え置かれますが、
アプリケーション内のモジュール全体のセキュリティー制約は、アプリケーションが処理される準備ができる前に処理される必要があります。モジュールのロードの据え置きは無効にされる必要があります。以下に、無効にする方法を示します。
- Web コンテナーの場合:
server.xml ファイル内に以下のエレメントが設定される必要があります。
<webContainer deferServletLoad="false"/>
- EJB コンテナーの場合:
server.xml ファイル内に以下のエレメントが設定される必要があります。
<ejbContainer startEJBsAtAppStart="true"/>
注: 上記のエレメントが設定されていない場合、
サーバー開始時にサード・パーティー JACC プロバイダーにセキュリティー制約情報が完全には伝搬されない可能性があります。その結果、サード・パーティー JACC プロバイダーが正しい許可決定を行えなくなることがあります。
このタスクについて
Java Authorization Contract for Containers 仕様 JSR 115 は許可プロバイダー用のインターフェースを定義しています。Liberty プロファイル・サーバーで、JACC プロバイダーをユーザー・フィーチャーとしてパッケージする必要があります。そのフィーチャーは com.ibm.wsspi.security.authorization.jacc.ProviderService インターフェースを実装する必要があります。
手順
- 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) {}
}
- このコンポーネントを、ユーザー・フィーチャーの一部である OSGi バンドルに、JACC プロバイダーと一緒にパッケージします。
- フィーチャーには OSGi サブシステム・コンテンツを必ず含めてください: com.ibm.ws.javaee.jacc.1.5;
location:="dev/api/spec/"。
- フィーチャーがユーザー製品拡張ロケーションにインストールされた後、
そのフィーチャー名を指定して server.xml ファイル
を構成します。以下に例を示します。
<featureManager>
...
<feature>usr:myJaccProvider</feature>
</featureManager>