データの変更と削除の操作を制御する
あるユーザーが登録したデータを、別のユーザーが変更・削除できないように制御します。
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'); } }
あるユーザーが登録したデータを、別のユーザーが変更・削除するとエラー画面に遷移します。