1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravelの認可処理はGateとPolicyどっちを使えばいいのかわからない

Posted at

概要

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に登録するのを忘れないようにしましょう。(よく忘れて怒られる...)

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?