認可サブジェクトコンテキスト¶
ここでは認可判断時に必要なユーザのサブジェクト情報を保持する認可サブジェクトコンテキストについて説明します。
コラム
認可サブジェクトコンテキストはアクセスコンテキストの一実装です。
認可サブジェクトコンテキストの役割¶
認可判断処理を行う際、「誰が」「何を」「どうする」が明確になっていなければなりません。「何を」「どうする」は認可要求側が明確にできますが、「誰が」については、ユーザの情報を基に所属ロールや所属組織の情報を一通りそろえる必要があります。(この処理をサブジェクト解決と呼んでいます)
認可判断処理は頻繁に発生しますので、処理のたびにサブジェクト解決処理を行っていると非常にシステム負荷が高くなります。認可サブジェクトコンテキストは、ユーザに対してログイン時から自明なサブジェクトをログイン時に解決しコンテキスト情報として保持することで、サブジェクト解決処理の回数を低減するためのキャッシュとして働きます
認可機構では認可判断を行う際、可能な限り認可サブジェクトコンテキストの情報をそのまま使用して処理を行います。
コラム
認可サブジェクトコンテキストは基本的に認可要求を行う時以外参照する必要はありません。また認可要求を行う場合でも、認可機構内で自動的に認可サブジェクトコンテキストを参照します(引数のサブジェクトグループ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種類用意しています(下図中の黄色で示したクラス)。
![]()
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))
コンテキストデコレータ¶
コンテキストデコレータはコンテキストビルダーに依頼されてコンテキストに格納する情報を実際に収集する役割を持っています。ここでは認可サブジェクトコンテキストで用意しているコンテキストデコレータについて説明します。
デフォルトで存在するサブジェクトコンテキストデコレータ¶
基盤・テナント情報¶
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共通マスタ情報の組織情報を解決するデコレータ(DepartmentDecorator、DepartmentPostDecorator)では、デフォルト組織セットの情報のみを扱います。
コラム
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
- 処理内容
- アカウントコンテキストのユーザコードからサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。