認可サブジェクトコンテキストの役割コンテキストビルダーコンテキストデコレータここでは認可判断時に必要なユーザのサブジェクト情報を保持する認可サブジェクトコンテキストについて説明します。コラム認可サブジェクトコンテキストはアクセスコンテキストの一実装です。行う際、「誰が」「何を」「どうする」が明確になっていなければなりません。「何を」「どうする」は認可要求側が明確にできますが、「誰が」については、ユーザの情報を基に所属ロールや所属組織の情報を一通りそろえる必要があります。(この処理をサブジェクト解決と呼んでいます)認可判断処理は頻繁に発生しますので、処理のたびにサブジェクト解決処理を行っていると非常にシステム負荷が高くなります。認可サブジェクトコンテキストは、ユーザに対してログイン時から自明なサブジェクトをログイン時に解決しコンテキスト情報として保持することで、サブジェクト解決処理の回数を低減するためのキャッシュとして働きます認可機構では認可判断を行う際、可能な限り認可サブジェクトコンテキストの情報をそのまま使用して処理を行います。コラム認可サブジェクトコンテキストは基本的に認可要求を行う時以外参照する必要はありません。認可要求を行う場合でも、認可機構内で自動的に認可サブジェクトコンテキストを参照します(引数のサブジェクトグループIDを省略した場合)。このため、アプリケーション開発において認可サブジェクトコンテキストを参照する必要は通常ありません。アカウントコンテキストの示すユーザに対するあらかじめ明示されるサブジェクトIDの一覧。解決可能なサブジェクトグループIDの一覧。現在のデフォルト実装ではユーザコードをそのまま格納しています。コンテキストリビジョン。このコンテキストの内容がアップデートされたり再構築されると値が変更されます。順序や連続性は保証されません。認可機構では認可サブジェクトコンテキストを構築するためのビルダーを3種類用意しています(下図中の黄色で示したクラス)。認可サブジェクトコンテキストのインスタンスを作成して特に何もせず返すビルダーです。動作できる環境にない場合に使用します。空の状態のコンテキストが返されるので、ユーザのサブジェクトがない状態になります。完全修飾クラス名jp.co.intra_mart.system.authz.context.impl.StandardAuthzSubjectContextBuilder処理内容アカウントコンテキストやユーザコンテキストを参照して、それらのコンテキストが構築されるタイミングで同時に認可サブジェクトコンテキストを構築します。デコレータを実行することでサブジェクトIDをコンテキストに登録させ、そのあとでそれらのサブジェクトIDをもとにサブジェクトグループIDの解決を行います。通常のWebでの利用を想定したコンテキストビルダです。コラムこのコンテキストビルダはテナント管理機能のテナント環境セットアップが完了していなければデコレータを一切実行しません。よって追加でサブジェクトが解決されない限りすべての認可判定が「禁止」になります。値からコンテキストの内容を固定的に生成します。subjectサブジェクトIDに格納する値を指定します。サブジェクトタイプとビジネスキーで指定できます。実際認可に使用されるのは後述のサブジェクトグループIDに指定する内容なので、内容の整合性が取れている必要があります。」を参照してください。例:b_m_role:menu_managersubjectGroupIdサブジェクトグループIDに格納する値を指定します。実際認可に利用されるのはこの値になります。」を参照してください。S(imm_user:aoyagi))コンテキストデコレータ¶コンテキストデコレータはコンテキストビルダーに依頼されてコンテキストに格納する情報を実際に収集する役割を持っています。ここでは認可サブジェクトコンテキストで用意しているコンテキストデコレータについて説明します。複写するデコレータです。この情報は認可要求時にセッションの情報を利用できるかどうかの判別のために利用されます。完全修飾クラス名jp.co.intra_mart.system.authz.context.decorator.impl.AuthenticationDecorator処理内容アカウントコンテキストから認証済みユーザかそうでないかを判別して、ゲストユーザおよび認証済みユーザのサブジェクトを認可サブジェクトコンテキストに追加します。モジュールを含めた環境では、認証済み外部ユーザかどうかの判別が追加されます。完全修飾クラス名jp.co.intra_mart.system.authz.context.decorator.impl.RoleDecorator処理内容アカウントコンテキストから所属ロール情報を取得して該当するサブジェクトを取得し、認可サブジェクトコンテキストに追加します。Spring処理内容HTTPコンテキストからリモートホストのIPアドレス(v4)を取得して該当するサブジェクトを取得し、認可サブジェクトコンテキストに追加します。コラム該当するIPアドレス(v4)の条件指定は「xxx.xxx.xxx.xxx」形式で行います。ワイルドカード指定を行うことができます。Winter処理内容コンテキストのビルドを行う時間からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。期間の判定は利用者のタイムゾーンでの日付で行われます。以下はIM共通マスタ情報を解決するデコレータです。注意IM共通マスタ情報の組織情報を解決するデコレータ(DepartmentDecorator、DepartmentPostDecorator)では、デフォルト組織セットの情報のみを扱います。コラムIM共通マスタ情報のデコレータはIM共通マスタのテナント環境セットアップが完了していないと処理をスキップします。このため、IM共通マスタのテナント環境セットアップが完了していない状況下ではユーザは組織やパブリックグループといったサブジェクトとして解決されなくなります。完全修飾クラス名jp.co.intra_mart.foundation.master.authz.context.decorator.impl.DepartmentDecorator処理内容ユーザコンテキストのカレント組織情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。カレント組織がサブジェクトとして登録されているかを検索します。カレント組織の上位組織が「下位」や「一致・下位」として登録されているかを検索します。カレント組織の下位組織が「上位」や「一致・上位」として登録されているかを検索します。カレント組織以外の所属情報についてはサブジェクト解決しません。完全修飾クラス名jp.co.intra_mart.foundation.master.authz.context.decorator.impl.DepartmentPostDecorator処理内容ユーザコンテキストの役職情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。役職ランクから上位や下位の条件付けがされているサブジェクトも判定します。完全修飾クラス名jp.co.intra_mart.foundation.master.authz.context.decorator.impl.PublicGroupDecorator処理内容ユーザコンテキストのパブリックグループ所属情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。所属グループがサブジェクトとして登録されているかを検索します。所属グループの上位グループが「下位」や「一致・下位」として登録されているかを検索します。所属グループの下位グループが「上位」や「一致・上位」として登録されているかを検索します。完全修飾クラス名jp.co.intra_mart.foundation.master.authz.context.decorator.impl.PublicGroupRoleDecorator処理内容ユーザコンテキストのパブリックグループ役割情報からサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。役割ランクから上位や下位の条件付けがされているサブジェクトも判定します。完全修飾クラス名jp.co.intra_mart.foundation.master.authz.context.decorator.impl.UserDecorator処理内容アカウントコンテキストのユーザコードからサブジェクトの解決を行い、認可サブジェクトコンテキストに追加します。