この章の内容は次のとおりです。
アクセス制御認可により、アプリケーションで独自の認可論理を定義して、クラスタ操作へのアクセスを制限できます。認可は、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認可チェックが実行されます。