概要
Laravelには認可処理として、GateとPolicyというものが用意されています。
最初はよくわからなくてどっちがどっちなんだ?と思うでしょう。
結論
わからなかったらGateをつかえばよい。
そもそも認可処理を担当するクラスはIlluminate/Auth/Access/Gate.php
で、Policyも結局はGateを使っています。
Policyはあくまでもモデルに対しての認可処理を簡単にかけるようにしたものです。
Policyのmiddlewareでの指定方法
Policyでの認可処理の書き方の一つにルートでミドルウェアとして書く方法があります。
Route::post('/book', 'HogeController@update')->middleware('can:update,book');
can
は固定で、:
のあとの1つめはポリシーのメソッド名になります。そのあとのは主に書き方が2種類あります。
モデルをつかわないメソッドの場合
ポリシーで以下のようなメソッドを定義したとします。
public function create(User $user)
{
}
このメソッドは引数にユーザーしか受け取っていません。
引数にモデルを渡さない場合の書き方は、
Route::get('/create', 'HogeController@create')->middleware('can:create,App\\Book');
とこのように完全修飾名を渡してあげます。この文字列はサービスプロバイダーに登録されたポリシーを探し出すためのkeyとしてのみ使用されます。
モデルをつかうメソッドの場合
public function update(User $user, Book $book)
{
}
このメソッドは引数にユーザーしか受け取っていません。
引数にモデルを渡さない場合の書き方は、
Route::put('/{book}', 'HogeController@store')->middleware('can:update,book');
としてあげます。第一引数の{}
の中身と同じ名前を指定しなければいけないことに注意してください。
ルートモデルバインディングを利用しているので合わせる必要があります。
Policyを使うときにはAuthServiceProvider
に登録するのを忘れないようにしましょう。(よく忘れて怒られる...)