データの変更と削除の操作を制御する

あるユーザーが登録したデータを、別のユーザーが変更・削除できないように制御します。
Laravelの認可機能のひとつであるポリシーを使って、制御します。


ポリシーを作成します。
以下のコマンドを実行してください。
appディレクトリ - Policiesディレクトリ以下に、ArticlePolicy.phpが作成されます。

% php artisan make:policy BookPolicy --model=Book


ArticlePolicy.phpを以下のように修正してください。

<?php

namespace App\Policies;

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

class BookPolicy
{
    use HandlesAuthorization;

    public function viewAny(?User $user)
    {
        return true;
    }

    public function view(?User $user, Book $book)
    {
        return true;
    }

    public function create(User $user)
    {
        return true;
    }

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

    public function delete(User $user, Book $book)
    {
        return $user->id === $book->user_id;
    }
}


appディレクトリ - Providersディレクトリの AuthServiceProvider.phpを以下のように修正してください。

<?php

namespace App\Providers;

use App\Policies\BookPolicy;
use App\Models\Book;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;

class AuthServiceProvider extends ServiceProvider
{
    protected $policies = [
        Book::class => BookPolicy::class,
    ];

    public function boot()
    {
        $this->registerPolicies();
    }
}


appディレクトリ - Httpディレクトリ - Controllersディレクトリ の BooksController.phpを以下のように修正してください。

class BooksController extends Controller
{
    public function __construct()
    {
        $this->authorizeResource(Book::class, 'book');
    }
}


あるユーザーが登録したデータを、別のユーザーが変更・削除するとエラー画面に遷移します。