参加しているLaravelのプロジェクトでGateというものを扱うタイミングがあった。
それの忘備録です。
Gateとは
Laravelは特定のリソースに対するユーザーアクションを認可する手軽な方法を提供している
- 組み込み認証サービス
- 認証されているユーザーでもDBのレコードの更新や削除ができない
Laravelが提供しているアクションを認可する2つの具体例が次
- Gate
- Policy
これらはRoutesやControllerのようなもの、と考えてok
Gate
クロージャーベースのシンプルなアプローチを提供する
Policy
Controllerの様に特定のModelやリソース周辺のロジックをひと塊にまとめる
今回は「Gate」についてまとめる
Gate
Gateは、ユーザーが特定のアクションを実行することを許可されているかどうかを判断する単なるクロージャーである。
- 通常、GateはGate Facadesを使用して
App\Providers\AuthServiceProvider
クラスのbootメソッド内で定義される - Gateは常に最初の引数としてユーザーインスタンスを受け取る
- オプションで関連するEloquentモデルなど追加の引数を受け取れる
Gateを使った例
<?php
use App\Models\Post;
use App\Models\User;
use Illuminate\Support\Facades\Gate;
/**
* 全認証/認証サービスを登録
*
* @return void
*/
public function boot()
{
$this->registerPolicies();
Gate::define('update-post', function (User $user, Post $post) {
return $user->id === $post->user_id;
});
}
上記の例では、ユーザーが特定のApp\Models\Postモデルを更新できるかどうかを判断するGateを定義した。ユーザーのidとPostを作成したuser_idを比較している。
アクションの認可
Gateを使用してアクションを認可するにはGate Facadesが提供するallowsかdeniesメソッドを使う必要がある。すでに認証済みのユーザーをこれらのメソッドに渡す必要はない。Laravelは自動的にユーザーをGateクロージャーに渡す。一般的には、認可が必要なアクションを実行する前に、アプリケーションのController内でGate認可メソッドを呼び出す。
<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Models\Post;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Gate;
class PostController extends Controller
{
/**
* 指定した投稿を更新
*
* @param \Illuminate\Http\Request $request
* @param \App\Models\Post $post
* @return \Illuminate\Http\Response
* /
public function update(Request $request, Post $post)
{
if (! Gate::allows('update-post', $post)) {
abort(403);
}
// 投稿を更新する処理
}
}
この様にLaravelのGateを使えば、そのユーザーに対してアクションを制限することができる。