部署20 × ロール4 × 「自分のデータだけ見せたい」。社内システムの厄介なアクセス要件に、Laravel アプリへ Casbin を組み込みながら挑んだ設計奮闘記です。ロール制御(RBAC)だけでは表現し切れない “所有者判定” を ABAC 的に補強しつつ、ポリシーマトリクス爆発を抑え、UI 工数を削減して MVP を最速リリースしたハイブリッド構成と実装ハックを 25 分で共有します。
================
Laravel の Gate/Policy では追いつかない複雑な権限制御に対し、オープンソースの Casbin を導入。しかしすぐに「ポリシー膨張」「継承の採用判断」「Eloquent 直渡しによる性能不確実性」という 3 つの壁にぶつかりました。試行錯誤の末にたどり着いたのが、RBAC ベースに ABAC 的“所有者判定”をアプリ層で補完するハイブリッド構成です。
本セッションでは、以下を具体コード付きで解説します。
・ 要件整理とモデル選定プロセス——ロールだけを捨てた決断
・ 落とし穴 Top3 と対処法
・ ポリシー爆発:ドメイン分割+ワイルドカードでポリシー圧縮、CSV→PHPUnit 自動生成テストも紹介
・ 継承 (g) の採用判断:メリット・デメリットと PJ が不採用にした理由
・ Eloquent 直渡し問題:N+1 回避のアプリ層 if 判定
・ ベンチ設計:middleware vs model‑level、QPS 実測のコツ
・ UI 後回しで MVP 切り出し——工数を半減させる分割術
権限管理に頭を悩ませている方、これから設計を任される方へ、実戦で使える指針と突破口をお届けします。