Skip to content

リクエストパイプライン

ミドルウェア登録順序

BFF のミドルウェアは以下の順序で登録する。外側(先に実行)から内側(後に実行)の順:

HTTP リクエスト① GlobalExceptionHandler未処理例外の捕捉RFC 7807 Problem Details② TraceIdResponseMiddlewareX-Trace-Id ヘッダー付与③ CORS許可オリジンのホワイトリスト検証④ Session AuthenticationSession Cookie 検証サーバーサイドセッション → JWT⑤ RateLimitingテナント別 1,000 req/minユーザー別 200 req/min⑥ PortalContextURL プレフィックスからポータル種別判定→ IPortalContext⑦ TenantContextJWT → TenantId 抽出→ ITenantContext / RLS⑧ Authorizationロール・ポリシーベース認可⑨ EndpointMinimal API エンドポイントMediatR Command/Query 送信
HTTP リクエスト① GlobalExceptionHandler未処理例外の捕捉RFC 7807 Problem Details② TraceIdResponseMiddlewareX-Trace-Id ヘッダー付与③ CORS許可オリジンのホワイトリスト検証④ Session AuthenticationSession Cookie 検証サーバーサイドセッション → JWT⑤ RateLimitingテナント別 1,000 req/minユーザー別 200 req/min⑥ PortalContextURL プレフィックスからポータル種別判定→ IPortalContext⑦ TenantContextJWT → TenantId 抽出→ ITenantContext / RLS⑧ Authorizationロール・ポリシーベース認可⑨ EndpointMinimal API エンドポイントMediatR Command/Query 送信
#ミドルウェア責務参照
GlobalExceptionHandler未処理例外の捕捉、RFC 7807 Problem Details 生成エラーハンドリング
TraceIdResponseMiddlewareX-Trace-Id レスポンスヘッダーの付与分散トレーシング
CORS許可オリジンのホワイトリスト検証security-design.md
Session AuthenticationSession Cookie の検証、サーバーサイドセッションから JWT 解決認証アーキテクチャ
RateLimitingテナント別(1,000 req/min)、ユーザー別(200 req/min)SR-008
PortalContextURL プレフィックス(/employee/, /admin/ 等)からポータル種別を判定し IPortalContext に設定
TenantContextJWT クレームから TenantId を抽出し ITenantContext に設定。RLS 用の SET app.current_tenant_id を発行operational-architecture.md
Authorizationロール・ポリシーベースの認可チェックsecurity-design.md
EndpointMinimal API エンドポイントの実行、MediatR Command/Query の送信

ポータル別ビューモデル変換

責務

Application 層の Query/Command 結果は、ドメインモデルに忠実な汎用的な形式で返却される。BFF はこれをポータルの対象ユーザーに最適化された ViewModel に変換する。

変換パターン: IPortalTransformer

csharp
// ポータル種別
public enum PortalType
{
    Employee,
    Admin,
    Agency,
    System
}

// ポータル別変換のインターフェース
public interface IPortalTransformer<TSource, TTarget>
{
    TTarget Transform(TSource source, PortalType portal);
}

具体的な変換例

CategoryJudgmentResult(→ DM-409

12個の boolean フラグを持つカテゴリ判定結果を、ポータルに応じて開示レベルを制御する:

ポータル変換内容
従業員フラグ群を非表示。判定結果を自然言語サマリに変換(例:「配偶者控除の対象です」)。判定理由(JudgmentReasons)を平易な表現に変換
管理者全フラグを表示。判定結果をテーブル形式で提供。手動オーバーライドが必要なケースのハイライト
代行事業者全フラグ + 監査情報(判定に使用されたパラメータのバージョン、判定日時)。複数テナント横断の一括表示対応

CalculationDiff(→ DM-410

3層の段階的開示データを、ポータルごとにデフォルトの開示レベルを設定する:

ポータルデフォルト表示展開可能
従業員Layer 1(過不足額の変動)Layer 2(控除の変動サマリ)
企業管理者Layer 1 + Layer 2Layer 3(カテゴリ判定変化)
代行事業者Layer 1 + Layer 2 + Layer 3全展開

BFF は CalculationDiffGenerator.Generate() の結果を受け取り、ポータルのデフォルトレベルに応じてレスポンスに含めるレイヤーを制御する。全レイヤーのデータは生成済みのため、フロントエンドがユーザー操作で追加レイヤーを要求した場合は、同じエンドポイントに ?detail=layer3 パラメータを付与して再取得する。

DeclarationSnapshot(→ DM-406

ポータル別のフィールド可視性制御:

フィールド分類従業員管理者代行事業者sys_support
基本属性(氏名、住所)表示表示表示表示
申告内容(控除申請)表示表示表示表示
給与額・賞与額非表示表示表示マスク
マイナンバー(下4桁)非表示閲覧権限者のみ閲覧権限者のみ非表示
計算結果詳細サマリのみ全項目全項目 + 監査全項目(マスク)

→ 満たす要件: SR-004 認可要件SR-009 データ分類