環境
Laravel9 Jetstream
Inertia Vue3
認可/アクセス制限
ユーザーレベルによって、表示や操作可能な範囲を制限します。
admin 表示・操作できる
user 表示・操作できない
LaravelではGate、Policyで対応
Gate シンプル
Policy 特定のモデル・アクションを認可
※事前にrole列を追記しておく
公式
Role 役割振り
1 admin
5 manager
9 user
数字が少ない方が権限が強い。
Roleの追加
database/migrations/create_users_table.php
tinyInteger('role') //テーブル内に追記
app/Actions/Fortify/CreateNewUser.php
return User::create([
ʻroleʼ => 9,
])
User::create()でまとめて登録できるようにするため、Modelsにも追記
app/Models/User.php
protected $fillable = [
ʻroleʼ
];
ダミーデータ
php artisan make:seeder UserSeeder
自動生成されたフォルダに追記
database/seeder/UserSeeder.php
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
DB::table('users')->insert([[
'name' => 'admin',
'email' => 'admin@admin.com',
'password' => Hash::make('pass123'),
'role' => 1
],
[
'name' => 'manager',
'email' => 'manager@manager.com',
'password' => Hash::make('pass123'),
'role' => 5
],
[
'name' => 'test',
'email' => 'test@test.com',
'password' => Hash::make('pass123'),
'role' => 9
],
]);
ダミーデータの登録
database/seeder/DatabaseSeeder.php
$this->call([
UserSeeder::class,
]);
php artisan migrate:fresh --seed
Gate
認可のためのクロージャベースのシンプルなアプローチ。
Gateファサードを使用しApp\Providers\AuthServiceProviderクラスのbootメソッドで定義。
App\Providers\AuthServiceProvider
use Illuminate\Support\Facades\Gate;
Gate::define('admin', function($user){
return $user->role === 1;
});
Gate::define('manager-higher', function($user){
return $user->role > 0 && $user->role <= 5;
});
Gate::define('user-higher', function($user){
return $user->role > 0 && $user->role <= 9;
});
ルートにGateの設定
routes/web.php
Route::prefix('manager')
->middleware('can:manager-higher')->group(function(){
Route::get('index', function () {
dd('manager');
});
});
試しにmanagerでログインし、/manager/indexで以下の表示があれば問題ありません。
userの場合はuserの値が返ってきます。
managerではエラーが起こる。
カスタムエラーページ
php artisan vendor:publish ̶tag=laravel-errors
views/errorsフォルダがコピーされる
公式