この章の内容は次のとおりです。
アクセス制御認可により、アプリケーションで独自の認可論理を定義して、クラスタ操作へのアクセスを制限できます。認可は、Subject内のPrincipalとして表される識別情報に基づきます。アプリケーションは、Subjectがコール元スレッドに存在することを確認します。Subjectが存在しない、または取得できない場合、操作は失敗し、SecurityExceptionエラーが発生します。
アプリケーションは、StorageAccessAuthorizerインタフェースを実装して、認可論理を指定します。実装は、オペレーション・オーバーライド構成ファイルで宣言され、また、キャッシュ構成ファイル内の分散スキーマのバッキング・マップを構成して、パーティション化キャッシュ上で有効化する必要があります。アクセス制御認可は、パーティション化キャッシュでのみ使用できます。
StorageAccessAuthorizerインタフェースにより、Read、Write、Read AnyおよびWrite Any認可チェックを実行するために使用するメソッドが提供されます。Coherenceは、StorageAccessAuthorizer実装による認可の決定が、論理的に一貫しているとみなします。特定のSubjectで、Write認可は特定のエントリに対するREAD認可を指し、Read Any認可はすべてのエントリに対するRead認可を指し、Write Any認可はすべてのエントリに対するWriteおよびRead認可を指します。
表4-1に、NamedCache APIおよびBinaryEntry APIメソッドで発生する認可チェックの一覧を示します。
表4-1 共通メソッドの認可チェック
| 認可チェック | NamedCache APIメソッド | BinaryEntry APIメソッド |
|---|---|---|
なし |
|
|
Read |
|
|
Write |
|
|
Read Any |
|
|
Write Any |
|
アクセス制御認可実装を作成するには、com.tangosol.net.security.StorageAccessAuthorizerインタフェースを実装するクラスを作成します。実装では、どのコール元(Subjectに基づき)を認可してエントリおよびバッキング・マップ・コンテキスト(それぞれBinaryEntryおよびBackingMapManagerContext)にアクセスするか定義する必要があります。
注意:
BinaryEntryおよびBackingMapManagerContext APIにより、キャッシュ名、サービス名およびサービスおよびクラスタ・レジストリへの完全なアクセスを取得することができます。
例4-1に、各認可リクエストのログ・メッセージを出力するサンプルのStorageAccessAuthorizer実装を示します。これは、Coherenceで提供されるAuditingAuthorizerクラスに基づき、 デフォルトのアクセス・コントローラ実装で使用されます。
例4-1 StorageAccessAuthorizer実装のサンプル
package com.examples.security;
import com.tangosol.net.BackingMapContext;
import com.tangosol.net.CacheFactory;
import com.tangosol.net.security.StorageAccessAuthorizer;
import com.tangosol.util.BinaryEntry;
import javax.security.auth.Subject;
public class MyLogAuthorizer implements StorageAccessAuthorizer
{
public MyLogAuthorizer()
{
this(false);
}
public MyLogAuthorizer(boolean fStrict)
{
f_fStrict = fStrict;
}
@Override
public void checkRead(BinaryEntry entry, Subject subject, int nReason)
{
logEntryRequest(entry, subject, false, nReason);
if (subject == null && f_fStrict)
{
throw new SecurityException("subject is not provided");
}
}
@Override
public void checkWrite(BinaryEntry entry, Subject subject, int nReason)
{
logEntryRequest(entry, subject, true, nReason);
if (subject == null && f_fStrict)
{
throw new SecurityException("subject is not provided");
}
}
@Override
public void checkReadAny(BackingMapContext context, Subject subject,
int nReason)
{
logMapRequest(context, subject, false, nReason);
if (subject == null && f_fStrict)
{
throw new SecurityException("subject is not provided");
}
}
@Override
public void checkWriteAny(BackingMapContext context, Subject subject,
int nReason)
{
logMapRequest(context, subject, true, nReason);
if (subject == null && f_fStrict)
{
throw new SecurityException("subject is not provided");
}
}
protected void logEntryRequest(BinaryEntry entry, Subject subject,
boolean fWrite, int nReason)
{
CacheFactory.log('"' + (fWrite ? "Write" : "Read")
+ "\" request for key=\""
+ entry.getKey()
+ (subject == null ?
"\" from unidentified user" :
"\" on behalf of " + subject.getPrincipals())
+ " caused by \"" + nReason + "\""
, CacheFactory.LOG_INFO);
}
protected void logMapRequest(BackingMapContext context, Subject subject,
boolean fWrite, int nReason)
{
CacheFactory.log('"' + (fWrite ? "Write-any" : "Read-any")
+ "\" request for cache \""
+ context.getCacheName() + '"'
+ (subject == null ?
" from unidentified user" :
" on behalf of " + subject.getPrincipals())
+ " caused by \"" + nReason + "\""
, CacheFactory.LOG_INFO);
}
private final boolean f_fStrict;
}
アクセス制御認可実装を宣言するには、オペレーション・オーバーライド・ファイルを編集して、<storage-authorizers要素を<cluster-config要素内に含め、各認可実装を<storage-authorizer要素を使用して宣言します。<storage-auhorizer要素の詳細は、『Oracle Coherenceでのアプリケーションの開発』を参照してください。各宣言には、実装を選択するためにパーティション化キャッシュで使用される一意のid属性が含まれている必要があります。次に例を示します。
<cluster-config>
<storage-authorizers>
<storage-authorizer id="LogAuthorizer">
<class-name>package.MyLogAuthorizer</class-name>
</storage-authorizer>
</storage-authorizers>
</cluster-config>
代替案として、<storage-authorizer>要素では、インスタンスを作成するためのファクトリ・クラスを使用する<class-factory-name>要素、およびオブジェクトのインスタンス化を実行するファクトリ・クラス上で静的なファクトリ・メソッドを指定する<method-name>要素の使用がサポートされています。次に例を示します。
<cluster-config>
<storage-authorizers>
<storage-authorizer id="LogAuthorizer">
<class-factory-name>package.MyAuthorizerFactory</class-factory-name>
<method-name>getAuthorizer</method-name>
</storage-authorizer>
</storage-authorizers>
</cluster-config>
実装に必要な初期化パラメータはすべて、<init-params>要素を使用して指定できます。次に例を示します。
<cluster-config>
<storage-authorizers>
<storage-authorizer id="LogAuthorizer">
<class-name>package.MyLogAuthorizer</class-name>
<init-params>
<init-param>
<param-name>f_fStrict</param-name>
<param-value>true</param-value>
</init-param>
</init-params>
</storage-authorizer>
</storage-authorizers>
</cluster-config>
パーティション化キャッシュでアクセス制御認可を有効化するには、キャッシュ構成ファイルを編集して、その値が、オペレーション・オーバーライド・ファイル内で宣言される認可実装のid属性値である分散スキーマの<backing-map-scheme>要素内で<storage-authorizer>要素を追加します。次に例を示します。
<distributed-scheme>
...
<backing-map-scheme>
<storage-authorizer>LogAuthorizer</storage-authorizer>
<local-scheme/>
</backing-map-scheme>
<autostart>true</autostart>
</distributed-scheme>
リスナーがMapTriggerListenerの場合、かわりにWrite Any認可チェックが実行されます。