intra-mart Accel Platform 認可仕様書 第13版 2020-04-01

認可サブジェクトコンテキスト

ここでは認可判断時に必要なユーザのサブジェクト情報を保持する認可サブジェクトコンテキストについて説明します。

コラム

認可サブジェクトコンテキストはアクセスコンテキストの一実装です。

認可サブジェクトコンテキストの役割

認可判断処理を行う際、「誰が」「何を」「どうする」が明確になっていなければなりません。「何を」「どうする」は認可要求側が明確にできますが、「誰が」については、ユーザの情報を基に所属ロールや所属組織の情報を一通りそろえる必要があります。(この処理をサブジェクト解決と呼んでいます)

認可判断処理は頻繁に発生しますので、処理のたびにサブジェクト解決処理を行っていると非常にシステム負荷が高くなります。認可サブジェクトコンテキストは、ユーザに対してログイン時から自明なサブジェクトをログイン時に解決しコンテキスト情報として保持することで、サブジェクト解決処理の回数を低減するためのキャッシュとして働きます

認可機構では認可判断を行う際、可能な限り認可サブジェクトコンテキストの情報をそのまま使用して処理を行います。

コラム

認可サブジェクトコンテキストは基本的に認可要求を行う時以外参照する必要はありません。
また認可要求を行う場合でも、認可機構内で自動的に認可サブジェクトコンテキストを参照します(引数のサブジェクトグループIDを省略した場合)。
このため、アプリケーション開発において認可サブジェクトコンテキストを参照する必要は通常ありません。

コンテキストインタフェース

完全修飾クラス名
jp.co.intra_mart.foundation.authz.context.AuthzSubjectContext

利用サンプル

Set<String> subjectIds = new HashSet<String>();
AuthzSubjectContext authzContext = null;

try {
    authzContext = Contexts.get(AuthzSubjectContext.class); // コンテキストの取得
} catch (final ContextNotFoundException e) {
    LOGGER.debug("AuthzSubjectContext not defined", e);
}

if (authzContext != null ) {
    subjectIds.addAll(authzContext.getSubjectIds());
    LOGGER.debug("user {} can use authz subject context", authzContext.getUserIdentifier());
}

...

保持する属性

属性 説明
subjectIds Set<String> アカウントコンテキストの示すユーザに対するあらかじめ明示されるサブジェクトIDの一覧。
subjectGroupIds Set<String> 上記 subjectIds から解決可能なサブジェクトグループIDの一覧。
userIdentifier String ユーザ識別子。現在のデフォルト実装ではユーザコードをそのまま格納しています。
revision long コンテキストリビジョン。このコンテキストの内容がアップデートされたり再構築されると値が変更されます。順序や連続性は保証されません。デフォルトの実装ではコンテキストビルダーがコンテキストを変更した時の System.currentTimeMillis() が入っています。

コンテキストビルダー

認可機構では認可サブジェクトコンテキストを構築するためのビルダーを3種類用意しています(下図中の黄色で示したクラス)。

../../../_images/ContextBuilder.png

AuthzSubjectContextBuilder

完全修飾クラス名
jp.co.intra_mart.system.authz.context.impl.AuthzSubjectContextBuilder
処理内容

認可サブジェクトコンテキストのインスタンスを作成して特に何もせず返すビルダーです。Web以外の環境などで後述の StandardAuthzSubjectContextBuilder が動作できる環境にない場合に使用します。

ほぼ空の状態のコンテキストが返されるので、ユーザのサブジェクトがない状態になります。

StandardAuthzSubjectContextBuilder

完全修飾クラス名
jp.co.intra_mart.system.authz.context.impl.StandardAuthzSubjectContextBuilder
処理内容

アカウントコンテキストやユーザコンテキストを参照して、それらのコンテキストが構築されるタイミングで同時に認可サブジェクトコンテキストを構築します。デコレータを実行することでサブジェクトIDをコンテキストに登録させ、そのあとでそれらのサブジェクトIDをもとにサブジェクトグループIDの解決を行います。

通常のWebでの利用を想定したコンテキストビルダです。

コラム

このコンテキストビルダはテナント管理機能のテナント環境セットアップが完了していなければデコレータを一切実行しません。
これによりテナント環境セットアップが完了していない環境下ではユーザのサブジェクトが一切解決されなくなり、
OnDemandSubjectResolver によって追加でサブジェクトが解決されない限りすべての認可判定が「禁止」になります。

ParameterizedAuthzContextBuilder

完全修飾クラス名
jp.co.intra_mart.system.authz.context.impl.ParameterizedAuthzContextBuilder
処理内容

おもに単体テスト目的で使用するビルダーですcontext-config.xmlに指定可能な <init-param> の値からコンテキストの内容を固定的に生成します。

<init-param> に以下のキーを指定可能です

キー 説明
userCd 設定した値が userIdentifier に設定されます。
subject

サブジェクトIDに格納する値を指定します。サブジェクトタイプとビジネスキーで指定できます。ただし実際認可に使用されるのは後述のサブジェクトグループIDに指定する内容なので、内容の整合性が取れている必要があります。複数指定可能です。

書式:
[サブジェクトタイプID]:[キー] ...
この書式については「式の文字列表現 」を参照してください。
例:
b_m_role:menu_manager
subjectGroupId

サブジェクトグループIDに格納する値を指定します。実際認可に利用されるのはこの値になります。複数指定可能です。

書式:
オペレータ(式, 式, 式, ... )
この書式については「式の文字列表現 」を参照してください。
例:
AND(S(b_m_role:menu_manager), S(imm_user:aoyagi))

コンテキストデコレータ

コンテキストデコレータはコンテキストビルダーに依頼されてコンテキストに格納する情報を実際に収集する役割を持っています。ここでは認可サブジェクトコンテキストで用意しているコンテキストデコレータについて説明します。

デフォルトで存在するサブジェクトコンテキストデコレータ

../../../_images/ContextDecorator.png

基盤・テナント情報

UserIdentifierDecorator
完全修飾クラス名
jp.co.intra_mart.system.authz.context.decorator.impl.UserIdentifierDecorator
処理内容
アカウントコンテキストのユーザコードを認可サブジェクトコンテキストの userIdentifier に複写するデコレータです。この情報は認可要求時にセッションの情報を利用できるかどうかの判別のために利用されます。
AuthenticationDecorator
完全修飾クラス名
jp.co.intra_mart.system.authz.context.decorator.impl.AuthenticationDecorator
処理内容
アカウントコンテキストから認証済みユーザかそうでないかを判別して、ゲストユーザおよび認証済みユーザのサブジェクトを認可サブジェクトコンテキストに追加します。
また、招待機能と外部ユーザ モジュールを含めた環境では、認証済み外部ユーザかどうかの判別が追加されます。
RoleDecorator
完全修飾クラス名
jp.co.intra_mart.system.authz.context.decorator.impl.RoleDecorator
処理内容
アカウントコンテキストから所属ロール情報を取得して該当するサブジェクトを取得し、認可サブジェクトコンテキストに追加します。
IPv4AddressDecorator
完全修飾クラス名
jp.co.intra_mart.system.authz.context.decorator.impl.IPv4AddressDecorator
導入バージョン
intra-mart Accel Platform 2013 Spring
処理内容

HTTPコンテキストからリモートホストのIPアドレス(v4)を取得して該当するサブジェクトを取得し、認可サブジェクトコンテキストに追加します。

コラム

該当するIPアドレス(v4)の条件指定は「xxx.xxx.xxx.xxx」形式で行います。 [m-n] での範囲指定や、* でのワイルドカード指定を行うことができます。
例) 192.168.[0-24].[0-254] 192.168.0.*
TermDecorator
完全修飾クラス名
jp.co.intra_mart.system.authz.context.decorator.impl.TermDecorator
導入バージョン
intra-mart Accel Platform 2013 Winter
処理内容
コンテキストのビルドを行う時間からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。 期間の判定は利用者のタイムゾーンでの日付で行われます。

IM共通マスタ情報

以下はIM共通マスタ情報を解決するデコレータです。

注意

IM共通マスタ情報の組織情報を解決するデコレータ(DepartmentDecoratorDepartmentPostDecorator)では、デフォルト組織セットの情報のみを扱います。

コラム

IM共通マスタ情報のデコレータはIM共通マスタのテナント環境セットアップが完了していないと処理をスキップします。このため、IM共通マスタのテナント環境セットアップが完了していない状況下ではユーザは組織やパブリックグループといったサブジェクトとして解決されなくなります。

DepartmentDecorator
完全修飾クラス名
jp.co.intra_mart.foundation.master.authz.context.decorator.impl.DepartmentDecorator
処理内容
ユーザコンテキストのカレント組織情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。
  • カレント組織がサブジェクトとして登録されているかを検索します。
  • カレント組織の上位組織が「下位」や「一致・下位」として登録されているかを検索します。
  • カレント組織の下位組織が「上位」や「一致・上位」として登録されているかを検索します。

カレント組織以外の所属情報についてはサブジェクト解決しません。

DepartmentPostDecorator
完全修飾クラス名
jp.co.intra_mart.foundation.master.authz.context.decorator.impl.DepartmentPostDecorator
処理内容
ユーザコンテキストの役職情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。
  • 役職ランクから上位や下位の条件付けがされているサブジェクトも判定します。
PublicGroupDecorator
完全修飾クラス名
jp.co.intra_mart.foundation.master.authz.context.decorator.impl.PublicGroupDecorator
処理内容
ユーザコンテキストのパブリックグループ所属情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。
  • 所属グループがサブジェクトとして登録されているかを検索します。
  • 所属グループの上位グループが「下位」や「一致・下位」として登録されているかを検索します。
  • 所属グループの下位グループが「上位」や「一致・上位」として登録されているかを検索します。
PublicGroupRoleDecorator
完全修飾クラス名
jp.co.intra_mart.foundation.master.authz.context.decorator.impl.PublicGroupRoleDecorator
処理内容
ユーザコンテキストのパブリックグループ役割情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。役割ランクから上位や下位の条件付けがされているサブジェクトも判定します。
UserDecorator
完全修飾クラス名
jp.co.intra_mart.foundation.master.authz.context.decorator.impl.UserDecorator
処理内容
アカウントコンテキストのユーザコードからサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。