AjaxのPOST処理に認可処理を追加/Policy/Laravel

LaravelでAjax POST処理のPolicyを作っていきます。今回は、Ajaxの詳細には触れていきません。

Userが、AjaxでCommentの編集をすることを想定した流れとなっています。

①:Policy作成の流れ

①-1:Policyの作成

$ php artisan make:policy CommentPolicy

App\Policiesの配下にCommentPolicy.php が作成される。

①-2:Policyを登録

App\Providers\AuthServiceProvider

protected $policies = []に 作成したPolicyを登録

    protected $policies = [
        Comment::class => CommentPolicy::class,
    ];

①-3:Policyのメソッド記述 (True OR Falseを返す)

実際のPolicyの処理を書いていきます。
①-1:Policyの作成 で作成した CommentPolicy.php に処理を記述していきます。

App\Policies\CommentPolicy.php
<?php

namespace App\Policies;

use App\Models\User;
use App\Models\Comment;
use Illuminate\Auth\Access\HandlesAuthorization;

class CommentPolicy
{
    use HandlesAuthorization;

    /**
     * Create a new policy instance.
     *
     * @return void
     */
    public function __construct()
    {
        //
    }

    public function update(User $user, Comment $comment)
    {
        return $user->id === $comment->user_id;
    }
}

メソッドの内容としては、非常にシンプルかと思います。

Userのid と commentのuser_idが
・同じ場合はTrueを返し、
・違う場合はFalseを返します。

①-4:Policyの呼び出し

任意のコントローラーにて、①-3:Policyのメソッド記述 で作成したupdateメソッドを呼び出します。
詳細は 「②:AjaxでPolicyを呼び出し/認可」 以降にて記述していきます。

②:AjaxでPolicyを呼び出し/認可

commentの編集をするメソッドに、認可の処理を追加していきます。

CommentController の edit メソッド で実行していきます。

前提として
・ $requestにcomment_idを含めている
・ $requestにinput_textでコメントが含まれている
・ JSに $commentで返す

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

use App\Models\Comment;
use App\Models\User;

class CommentController extends Controller
{

    public function edit(Request $request)
    {

        // comment_idから編集予定のComment modelを取得
        $comment = Comment::where('id', $request->comment_id)->get()->first();

        // 編集処理をするUserの取得    
        $user = Auth::user();

        // 編集User と 編集予定のCommentを作成したUserが 同一なのかを認可
        if($user->can('update',$comment)){

            $comment->comment = $request->input_text;
            $comment->save();

            // JSに$commentを返す。  
            return $comment;
        } else {
            abort(403);
        }
    }

}

③:Ajaxの処理で躓いたところ

正直、上記の処理は、Ajax関係なくない??と思うかと思います。
確かに、上記の処理であれば、Ajax関係ない処理として通用します。

私は、authorize() メソッドを利用した際に躓きました。
authorizeメソッドでは、 Userのインスタンスを渡す必要が無く、自動的に読み込んでくれています。

ここが、AjaxだとUserインスタンスが自動で読み込まれません。