認可判断機能¶
ここでは認可判断をするための機能について解説します。
認可判断機能の構造¶
認可判断機構は複数の認可判断モジュールを実行しその結果を集約して最終的な認可判断を行います。
![]()
認可判断機能は起動時に設定ファイル authz-decision-config.xml を読み込み、認可判断モジュールをロードします。
<?xml version="1.0" encoding="UTF-8"?> <a:authz-decision-config xmlns:a="http://www.intra-mart.jp/authz/authz-decision-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.intra-mart.jp/authz/authz-decision-config ../schema/authz-decision-config.xsd"> <a:decision-config name="default" combinator="permit-overrides"> <a:module class="jp.co.intra_mart.foundation.authz.services.decision.impl.AdministratorByPassModule" /> <a:module class="jp.co.intra_mart.foundation.authz.services.decision.impl.PlatformWorkerByPassModule" /> <a:module class="jp.co.intra_mart.foundation.authz.services.decision.impl.StandardPolicyDecisionModule" /> </a:decision-config> </a:authz-decision-config>
- decision-config 要素 1要素が設定の単位です。
- name 属性 : 設定識別用の名称。将来の拡張の為に用意されています。現状では基本的に default しか受け付けません。他の値を設定しても参照しません。
- combinator 属性 : 複数のモジュールの処理結果をどのように判断するかを指定します。以下の中から選択します。
- permit-overrides : 1つでも Permit を返したモジュールがあれば結果は Permit になります。
- deny-overrides : 1つでも Deny を返したモジュールがあれば結果は Deny になります。
- first-applicable : 上から順に評価して最初に Permit / Deny を返したモジュールの結果で処理します。
- module 要素 認可判断を行うモジュールクラスを定義します。このクラスは DecisionModule インタフェースを実装していなければなりません。
- class 属性 : 完全修飾クラス名を指定します。
認可判断機能は上記の設定にしたがって、複数の認可判断モジュールを実行し、その結果から最終的な判断を行います。
認可判断モジュール¶
認可判断モジュールは認可要求の情報を受け取って、ユーザを認可してよいかどうかを判断する機構です。このモジュールは複数定義でき、複数の認可判定処理を実行することができるようになっています。認可判断モジュールの下した判断が最終的に採用されるかどうかは認可判断機能が決めます。
認可判断モジュールは次の3種類の値を返すことができます。
- Permit
- 要求を許可する。
- Deny
- 要求を禁止する。
- NotApplicable
- このモジュールでは判断しない・判断できないことを表す。許可でも禁止でもない。
デフォルトで組み込まれるモジュール¶
デフォルトインストール状態では以下の3つのモジュールが組み込まれた状態になっています。
- StandardPolicyDecisionModule
- AdministratorByPassModule
- PlatformWorkerByPassModule
順に説明します。
StandardPolicyDecisionModule¶
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.decision.impl.StandardPolicyDecisionModule
認可設定画面で設定したポリシーを参照して認可判断を行うモジュールです。このモジュールを外すと認可設定画面の設定内容が認可判断に使用されなくなります。ほとんどの場合、通常の運用で必要になります。
ポリシーの設定内容を解釈するために内部で ポリシー解釈器 を使用しています。
AdministratorByPassModule¶
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.decision.impl.AdministratorByPassModule
アカウントコンテキストを参照し、システム管理者であればすべての認可要求に一律許可( Permit )を返すモジュール。システム管理者でなければ NotApplicable を返します。このため、システム管理者はすべてのリソースに無制限にアクセスできます。特にテナント環境セットアップ時にすべての権限を超越するために使用されます。
PlatformWorkerByPassModule¶
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.decision.impl.PlatformWorkerByPassModule
コンテキストを参照し、ユーザタイプがプラットフォームユーザの場合に認可要求に一律許可( Permit )を返すモジュール。プラットフォームユーザでなければ NotApplicable を返します。これは主にバッチ処理時に一律認可を許可するために設定されています。
ポリシー解釈器¶
ポリシー解釈器は特定のリソースに対して実際に適用される認可設定を導出する役割を担う部分です。ポリシー解釈にあたっておもに以下のポイントを決定しています。
- リソースの階層構造に沿った権限の継承動作
- ポリシー設定が行われていない場合のデフォルト値( Permit / Deny )
- 複数のサブジェクトグループに対して異なるエフェクトが設定されている場合の判定方式
ポリシー解釈器は以下のインタフェースを持ちます。
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.admin.impl.PolicyInterpreterModule
また、キャッシュの実装を想定したポリシー解釈器は以下のインタフェースです。
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.admin.impl.cache.CachedPolicyInterpreterModule
ポリシー解釈は大きく分けて2つの場面で利用されます。
- 認可クライアントから認可要求を受け、実際に認可判断を行う際に指定されたリソース、ログインユーザのサブジェクトから、リソース構造や設定されたエフェクトを勘案し、実質的な認可判断処理を行います。( interpretEffect() )
- 認可設定のメンテナンス機能において、リソースおよびサブジェクトに対して、リソース構造や設定されたエフェクトを勘案し実質的な設定を解釈します。( interpretPolicies() )
このため、このインタフェースの持つ2つのメソッドは、双方とも同じ方式の解釈を行わなければなりません。
デフォルトで組み込まれるモジュール¶
認可機構はデフォルトではホワイトリスト方式の認可判断を行っています。
WhiteListPolicyInterpreterModule¶
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.admin.impl.WhiteListPolicyInterpreterModule
ポリシー設定をホワイトリストとして解釈します。
- 直接ポリシーが設定されていないリソースについて、リソース構造に従って設定の継承を行います。
- デフォルト値は Deny として扱います
- ユーザにマッチするサブジェクトグループについて一つでも Permit が設定されていれば Permit として判断します
内部でキャッシュを保持しています。 キャッシュを適切なタイミングで更新するために CachedPolicyInterpreterModule を実装してます。
キャッシュ設定¶
設定ファイルの変更によりキャッシュの利用方針の変更することが可能です。
- ポリシーのキャッシュサイズの設定
WhiteListPolicyInterpreterModule で使用するキャッシュの設定を行えます。キャッシュの有効・無効、キャッシングのサイズの設定が行えます。キャッシュの実装はim-cacheを利用しているため、im-cacheから提供している設定が行えます。
- 設定ファイルの配置場所
- <CONTEXT_PATH>/WEB-INF/conf/im-ehcache-config/authz-policy.xml
- ポリシーのキャッシュ対象となる条件の設定
キャッシュを行うリソースのリソースタイプを設定します。この設定で指定したリソースタイプのポリシーのみキャッシュを行います。
- 設定ファイルの配置場所
- <CONTEXT_PATH>/WEB-INF/conf/policy-cache-config/
- XMLスキーマファイル
- <CONTEXT_PATH>/WEB-INF/schema/policy-cache-config.xsd
以下のサンプルをもとに設定内容について説明します。
<?xml version="1.0" encoding="UTF-8"?> <policy-cache-config xmlns="http://www.intra-mart.jp/authz/policy-cache-config" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.intra-mart.jp/authz/policy-cache-config ../../schema/policy-cache-config.xsd"> <cache-target> <resource-type>service</resource-type> </cache-target> </policy-cache-config>
- policy-cache-config要素 : 設定のルートになる要素です。
- cache-target要素 : キャッシュ対象の指定を行う要素です。
- resource-type要素 : キャッシュ対象となるリソースタイプを指定する要素です。cache-target要素内に複数指定できます。
API¶
認可判断機構を呼び出すには下記のインタフェースを使用します。
- 認可判断機能API ファクトリ
- PolicyDecisionServiceFactory ( jp.co.intra_mart.foundation.authz.services.decision.PolicyDecisionServiceFactory )
- 認可判断機能API
- PolicyDecisionService ( jp.co.intra_mart.foundation.authz.services.decision.PolicyDecisionService )
注意
ただし、アプリケーションは原則的に認可判断機能のAPIを直接呼び出してはいけません。 認可判断を行いたい場合は、「APIによる認可要求 」を参照してください。
使用例
String userCd = "aoyagi" String resource = "service://somple/service1" String action = "execute"; PolicyDecisionService policyDecisionService = PolicyDecisionServiceFactory.getInstance().getPolicyDecisionService(); Effect e = policyDecisionService.authorize(userCd, resource, action) if (e.equals(Effect.PERMIT)) { LOGGER.trace("client result:{}", AuthorizeResult.Permit.toString()); //$NON-NLS-1$ return AuthorizeResult.Permit; } else { LOGGER.trace("client result:{}", AuthorizeResult.Deny.toString()); //$NON-NLS-1$ return AuthorizeResult.Deny; }