背景
マルチテナント分離の根幹。全SQLに WHERE tenant_id = :currentTenantId を自動付与する仕組みが未実装。
方式は ADR-0010: マルチテナント絞り込みの自動付与は Hibernate Filter で行う(Issue #145、2026-05-31 Accepted)で確定済。本タスクは ADR-0010 の実コード配線を担う。
やること
TenantContext (ThreadLocal保持)
TenantContextFilter: X-Tenant-Idヘッダ→user_tenants検証→ACTIVEなら設定
- 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)
- 既存 Repository の SELECT 系派生クエリ命名を緩和(コーディング規約 §8.1 v1.4)
TaskJpaRepository#findByIdAndTenantId → findById に書き換え(他 Repository も同様)
@Modifying UPDATE/DELETE および native query は引き続き明示絞り(deleteByTenantIdAndId 等)
- クロステナント漏洩テストを CI に追加(設計規約 §9.4: 参照系 404 / 更新系 403)
受け入れ条件
参照
背景
マルチテナント分離の根幹。全SQLに
WHERE tenant_id = :currentTenantIdを自動付与する仕組みが未実装。方式は ADR-0010: マルチテナント絞り込みの自動付与は Hibernate Filter で行う(Issue #145、2026-05-31 Accepted)で確定済。本タスクは ADR-0010 の実コード配線を担う。
やること
TenantContext(ThreadLocal保持)TenantContextFilter: X-Tenant-Idヘッダ→user_tenants検証→ACTIVEなら設定tenant_filter定義 + 全エンティティに@FilterDef/@Filter@FilterDefを共通 mapped superclass に置く案 vspackage-info.javaに置く案を比較選定(ADR-0010 §6)TenantContextを session に注入する経路はOncePerRequestFilter案 vs HibernateSessionEventListener案を比較選定(ADR-0010 §6)TaskJpaRepository#findByIdAndTenantId→findByIdに書き換え(他 Repository も同様)@ModifyingUPDATE/DELETE および native query は引き続き明示絞り(deleteByTenantIdAndId等)受け入れ条件
task.subTasks等の lazy fetch)でも Filter が効くことを確認findById等の単純命名に書き換え済(§8.1 v1.4)@ModifyingUPDATE/DELETE / native query は引き続き明示絞り(§3.3 / §8.1 維持ルール)@FilterDef配置案・TenantContext注入経路案の選定根拠が PR description に記載参照
docs/reviews/2026-05-10-scaffold-vs-design-gap-analysis.md§ G-4