LaravelのPolicyで認可をするときの方法と手順
いつもご利用ありがとうございます。
この記事には広告が掲載されており、その広告費によって運営しています。
認可で Policy を使おうとしたら、手順を間違えて
Argument 2 passed to App\Policies\PostPolicy::Post() must be an instance of App\Post, string given, called in /vendor/laravel/framework/src/Illuminate/Auth/Access/Gate.php on line 198 {"userId":1,"exception":"[object] (Symfony\\Component\\Debug\\Exception\\FatalThrowableError(code: 0):
といったエラーが出たので、もう2度とこんなエラーで時間を使いたくないと思 い、
Laravel の Policy を使って認可をするときの方法について手順をまとめました。
認可とは?
その人が、それをする権限があるかどうかを確認することです。
認証との違い
認証は「この人が誰か」を特定しているのに対して、
その人は権限があるか?というのが認可になります。
Laravel では Policy を使って認可を実装することができます。
Policy を使う手順
今回は、ユーザーが投稿を編集する権限があるかどうかをチェックしてみます。
コマンドで Policy ファイルを作成する
php artisan make:policy PostPolicy
PostPolicy ファイルに書く
<?php
namespace App\Policies;
use App\Post;
use App\User;
class PostPolicy
{
//Userは認証しているモデル
//Postは今回認可で使いたいモデル
public function update(User $user, Post $post)
{
return $user->id === $post->user_id;
}
}
AuthServiceProvider に書く
AuthServiceProvider は、App/Providers/AuthServiceProvider.php にあります。
boot という関数の中に追記します。
public function boot()
{
$this->registerPolicies();
//追記
Gate::define('update-post','App\Policies\PostPolicy@update');
}
web.php
ルートにミドルウェアを追加して、認可通ってない人には Controller を呼べないようにします。
グループが分かりやすいので、このやり方が好きです。
Route::group('middleware' => ['auth','can:update-post,post']], function () {
Route::post('post/update/{post}',"PostController@update");
});
①can:update-post のところは、AuthServiceProvider で define した内容が入ります。
②「can:update-post,post」の引数の post を忘れないように気をつけてください
③URL のパラメーターには postId が入ります。
post/update/{post}⇦実質postIdが入ります。
PostController
use App\Post;
public function update(Post $post)
{
}
Post $post を忘れないように気をつけてください。
うまくいくと403エラー
別の人が作った post を変更しようとすると
403 (Forbidden)
このエラーが出たら成功です。
まとめ
Policy を書くのはたまーにだったりするので手順をまとめてみました。
苦情・意見は Twitter の DM にお願いします。
それでは!