Skip to content

backend: TenantContext + TenantContextFilter + Hibernate Filter 実装 (N5) #87

Description

@win2cot

背景

マルチテナント分離の根幹。全SQLに WHERE tenant_id = :currentTenantId を自動付与する仕組みが未実装。

方式は ADR-0010: マルチテナント絞り込みの自動付与は Hibernate Filter で行う(Issue #145、2026-05-31 Accepted)で確定済。本タスクは ADR-0010 の実コード配線を担う。

やること

  1. TenantContext (ThreadLocal保持)
  2. TenantContextFilter: X-Tenant-Idヘッダ→user_tenants検証→ACTIVEなら設定
  3. Hibernate Filter tenant_filter 定義 + 全エンティティに @FilterDef / @Filter
    • @FilterDef を共通 mapped superclass に置く案 vs package-info.java に置く案を比較選定(ADR-0010 §6)
    • TenantContext を session に注入する経路は OncePerRequestFilter 案 vs Hibernate SessionEventListener 案を比較選定(ADR-0010 §6)
  4. 既存 Repository の SELECT 系派生クエリ命名を緩和(コーディング規約 §8.1 v1.4)
    • TaskJpaRepository#findByIdAndTenantIdfindById に書き換え(他 Repository も同様)
    • @Modifying UPDATE/DELETE および native query は引き続き明示絞り(deleteByTenantIdAndId 等)
  5. クロステナント漏洩テストを CI に追加(設計規約 §9.4: 参照系 404 / 更新系 403)

受け入れ条件

  • X-Tenant-Id 経由で全 API 自動絞込
  • エンティティ関連ナビゲーション(task.subTasks 等の lazy fetch)でも Filter が効くことを確認
  • クロステナント漏洩テストがグリーン(参照系 404 / 更新系 403、§9.4)
  • SELECT 系 Repository 派生クエリが findById 等の単純命名に書き換え済(§8.1 v1.4)
  • @Modifying UPDATE/DELETE / native query は引き続き明示絞り(§3.3 / §8.1 維持ルール)
  • @FilterDef 配置案・TenantContext 注入経路案の選定根拠が PR description に記載

参照

Metadata

Metadata

Assignees

No one assigned

    Labels

    area/backendJava / Spring バックエンド実装変更area/security認証・認可 / NIST 準拠 / セキュリティ設定変更priority/p0Critical / Blocker。本番影響あり、または他作業がブロックされる

    Projects

    No projects

    Milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions