夕方に湯田温泉へ

建設アシストアプリケーションをマルチテナントSaaSとして「他社のデータは存在自体が見えない」状態を全モデルに実現する作業をする・・設計上の重要ポイントとして、グローバルスコープ単体ではなく、既存のIDOR(Insecure Direct Object Reference:URLのIDを書き換えて、他人のデータにアクセスする攻撃)対策トレイト(AuthorizesTenantAccess)と二重防御になっている。仮にどちらか一方に穴があっても、もう一方が守る構造で、これが大手組織のセキュリティ監査に耐えられる根拠になる

■会社IDを直接持つ主要モデル10個に、自動テナント絞り込みを適用

分類対象モデル例絞り込み方式
直接持ちUser, Project, Department など7モデルWHERE company_id = 自社
NULL=全社共通テンプレート・プリセット系3モデルWHERE company_id = 自社 OR NULL

途中で発覚した重大問題と解決:User モデルにスコープを適用した直後、ログイン後の画面でメモリ枯渇エラーが発生・・・原因は無限再帰

■Project配下・監査計画配下のモデル13個に適用。これらは company_id を直接持たず、親テーブル経由で絞り込む
実データで確認した効果の例

モデルスコープ前スコープ後
ProjectEnvAspect241件(他社75件含む)166件(自社のみ)
ProjectCondition49件(他社23件含む)26件(自社のみ)

■最終状態
テスト:TenantIsolationTest 31パス(38 assertions) 対象:A分類10 + B分類13 = 計23モデル完了

湯田温泉駅からホテルまで2kmを歩く 湯田温泉の白狐も久しぶり
天気は曇り空 ホテルからの湯田温泉裏通りの眺め
  • 2026年7月
     12345
    6789101112
    13141516171819
    20212223242526
    2728293031