第08回: Policy/Gateの実践認可 — 「認証」と「認可」、まだ混同していませんか?
「ログインしているのに自分の記事が削除できてしまった」「管理者のみ操作できるはずなのに他のユーザーも操作できた」――認可の実装漏れは進次的なセキュリティリスクを生みます。
現代のWeb開発者へ。基礎文法からアーキテクチャまで、体系的に学べる技術ガイド。
# User.php
public function init() {
$this->role = 'Architect';
return 'Ready to build';
}
「ログインしているのに自分の記事が削除できてしまった」「管理者のみ操作できるはずなのに他のユーザーも操作できた」――認可の実装漏れは進次的なセキュリティリスクを生みます。
「一覧画面を開くたびに遅い」「本番だとタイムアウトする」――注意してログを見ると、発行されているSQLが数百件、なんてことがあります。これがN+1問題です。「記事数だけSQLが発行される」状態で、テーブルが増えるほど効果が大きくなります。
APIレスポンスの形式がエンドポイントごとに微妙に差い、フロントエンドの頓いが増える――この問題は、レスポンス整形ロジックが Controllerやモデルに散らばっている ことから生まれます。
$request->validate([…]) が100行を越えている、あるいは条件付きルールや配列バリデーションがヨリにたってくる――Controllerの記述が膨らんできたとき、Form Requestがその解決策です。
Route::get(‘/posts/{id}/comments/{cid}’, …) のようなルートがファイル中に散らばっていないでしょうか?ルート定義とControllerが糸引っ張り合いの状態になると、新しいエンドポイントを追加するたびに全体を見回す必要が出てきます。
「認証ミドルウェアを設定したはずなのに、なぜかAPIが素通りする」「ログが二重に出力される」――こうした不具合の多くは、ミドルウェアの 順序や適用範囲の誤解 から生まれます。
プロジェクトが成長するにつれて、AppServiceProvider の register() がどんどん膨らんでいく――これは多くのLaravelプロジェクトで起きる「初期化処理の肥大化」です。依存登録・イベント購読・ポリシー登録が一か所に混在すると、変更のたびに影響範囲が読め…
app(PaymentGateway::class) と書くだけで、設定ファイルも書かず、new もせずにオブジェクトが降ってくる。これはなぜでしょうか?Laravelを深く使うほど「どこで何が解決されているのか」が分からなくなる瞬間が来ます。サービスコンテナを理解すると、その霧…
本番リリースは確認項目が多く、手順書なしでは抜け漏れが起きやすい場面です。チェックリストを持つことで、セキュリティ・パフォーマンス・品質の確認を漏れなく実施でき、見落としによる事故を防げます。
エラーの検知が遅れるほど影響を受けるユーザー数が増え、信頼を失います。Sentryを使えば、エラーをリアルタイムに収集・分類・通知でき、障害の影響範囲を最小限に抑えられます。