認可判断機能¶
ここでは認可判断をするための機能について解説します。
認可判断機能の構造¶
認可判断機構は複数の認可判断モジュールを実行しその結果を集約して最終的な認可判断を行います。
![]()
認可判断機能は起動時に設定ファイル 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
- 上から順に評価して最初に Permit / Block を返したモジュールの結果で処理します。
- deny-overrides
- 上から順に評価して最初に Deny / Block を返したモジュールの結果で処理します。
- first-applicable
- 上から順に評価して最初に Permit / Deny / Block を返したモジュールの結果で処理します。
module 要素 認可判断を行うモジュールクラスを定義します。このクラスは DecisionModule インタフェースを実装していなければなりません。
- class 属性 : 完全修飾クラス名を指定します。
認可判断機能は上記の設定にしたがって、複数の認可判断モジュールを実行し、その結果から最終的な判断を行います。
認可判断モジュール¶
認可判断モジュールは認可要求の情報を受け取って、ユーザを認可してよいかどうかを判断する機構です。このモジュールは複数定義でき、複数の認可判定処理を実行できます。認可判断モジュールの下した判断が最終的に採用されるかどうかは認可判断機能が決めます。
認可判断モジュールは次の4種類の値を返すことができます。
- Permit
- 要求を許可します。
- Deny
- 要求を禁止します。
- Block
- 要求されたリソースが閉塞状態であることを表します。
- NotApplicable
- このモジュールでは判断しない・判断できないことを表します。
デフォルトで組み込まれるモジュール¶
デフォルトインストール状態は以下の3つのモジュールが組み込まれた状態です。
- StandardPolicyDecisionModule
- AdministratorByPassModule
- PlatformWorkerByPassModule
順に説明します。
StandardPolicyDecisionModule¶
- 完全修飾クラス名
- jp.co.intra_mart.foundation.authz.services.decision.impl.StandardPolicyDecisionModule
認可設定画面で設定したポリシーを参照して認可判断を行うモジュールです。認可設定画面の設定内容に基づいて、許可(Permit)・禁止(Deny)・閉塞(Block)を返します。
このモジュールを外すと認可設定画面の設定内容が認可判断に使用されなくなります。ほとんどの場合、通常の運用で必要です。
ポリシーの設定内容を解釈するために内部で ポリシー解釈器 を使用しています。
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://sample/service1" String action = "execute"; PolicyDecisionService policyDecisionService = PolicyDecisionServiceFactory.getInstance().getPolicyDecisionService(); Effect e = policyDecisionService.authorize(userCd, resource, action) if (e.equals(Effect.PERMIT)) { // 許可されている場合に実行する処理 } else { // 許可されていない場合に実行する処理 }
閉塞¶
StandardPolicyDecisionModule では閉塞状態の判断を行います。閉塞とは、リソースとアクションに対して制限をかける機能です。閉塞が行われているリソースとアクションに対して認可判断を行った場合、ポリシーの設定状態に関わらず、認可判断の結果は「閉塞(Block)」です。閉塞の設定は認可設定画面、および、「ResourceBlocker」で行えます。コラム
ResourceBlocker は intra-mart Accel Platform 2013 Winter より利用可能です。
閉塞の仕様¶
閉塞の状態管理は「リソースグループ汎用属性」を利用しています。利用するリソースグループ汎用属性のキーは im_authz-blocked です。この値は「ResourceGroupAttributeKey.BLOCKED」で取得可能です。閉塞状態別のリソースグループ汎用属性の値は以下の通りです。
- リソースグループ自体を閉塞する
値には、文字列 ALL が代入されます。
- リソースグループに紐づく特定のアクションを閉塞する
値には、閉塞するアクションが代入されます。複数のアクションを閉塞する場合は、カンマ区切りで複数のアクションが代入されます
形式
<リソースタイプ>:<アクション>,<リソースタイプ>:<アクション>,...例:メニューグループのアクション、管理と参照を閉塞する場合
im-menu-group:admin,im-menu-group:read
- 閉塞しない
リソースグループに紐づく汎用属性のキー im_authz-blocked を持つレコードがない状態です。閉塞状態は、認可判断を行うリソースに紐づくリソースグループが閉塞されているかどうかで判別します。特定のリソースグループ配下のリソースグループすべてに対して閉塞を行う場合、リソースグループ配下のリソースグループすべてに対して閉塞の設定を行う必要があります。コラム
認可設定画面、および、「ResourceBlocker」で閉塞状態の設定を行った場合、指定したリソースグループ配下のリソースグループすべてに対して閉塞状態の設定が反映されます。