Laravel

LaravelのPolicyで認可をするときの方法と手順

いつもご利用ありがとうございます。このブログは、広告費によって運営されています。

オススメ本
Web技術を勉強するなら、かなりオススメの雑誌です。毎月新しい発見があります。ついに最終号・・・、みなさん買いましょう!!
読んで損することはない名著。命名で悩むことが多い人はこの本がオススメです。

⇨ Laravel の 記事の目次はこちら

認可で 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 にお願いします。

それでは!