管理者には特定のポリシー内の全てのアクションを認可するように設定していきます。
ユーザーの削除はそのユーザーしか削除できないなどのポリシーを設定している場合でも、管理者であれば、削除できるようになります。
親記事
Dockerで環境構築して Laravel 9で CRUD 機能を作る
2022年03月15日
Laravel環境
- macOS
- Laravel v9.0.2
- Docker 20.10.12
設定
設定ファイルに管理者のユーザーIDを保存する方法で管理者を管理します。
<?php
use Illuminate\Support\Facades\Facade;
return [
'admin' => [
'1',
],
ポリシーの作成
ポリシーは、特定のモデルに関する認可処理を行うクラスです。管理者はUserモデルに関するので、UserPolicyを作成します。
php artisan make:policy UserPolicy
//sail
sail artisan make:policy UserPolicy
app/Policies ディレクトリにUserPolicy.php ファイルが作成されます。
ポリシーの登録
app/Providers/AuthServiceProvider.php ファイルでポリシーを登録します。
protected $policies = [
User::class => UserPolicy::class,
];
ポリシーメソッド
<?php
namespace App\Policies;
use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;
class UserPolicy
{
use HandlesAuthorization;
public function isAdmin(User $user) {
$admin = config('app.admin');
return in_array($user->id, $admin);
}
public function before(User $user, $ability) {
if ($this->isAdmin($user)) {
return true;
}
}
}
13-14: 設定ファイルから管理者に指定したIDを取得して、現在の認証済みのユーザーが管理者かどうかを判断します。
17-20: before メソッドはポリシー上の他のメソッドの前に実行されます。
これで管理者にアクションの実行の許可ができました。