0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Laravel】Role 認可/アクセス制限

Posted at

環境
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') //テーブル内に追記

image.png

app/Actions/Fortify/CreateNewUser.php
return User::create([
 ʻroleʼ => 9, 
])

image.png

User::create()でまとめて登録できるようにするため、Modelsにも追記

app/Models/User.php
 protected $fillable = [
 ʻroleʼ 
]; 

image.png

ダミーデータ

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        
    ],
]);

image.png

ダミーデータの登録

database/seeder/DatabaseSeeder.php
$this->call([
     UserSeeder::class,
 ]); 

image.png

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;
});

image.png

ルートにGateの設定

routes/web.php
Route::prefix('manager')
    ->middleware('can:manager-higher')->group(function(){
     Route::get('index', function () {
     dd('manager');
     });
}); 

試しにmanagerでログインし、/manager/indexで以下の表示があれば問題ありません。

image.png

userの場合はuserの値が返ってきます。

image.png

userでログインした場合
userの値は表示されるが
image.png

managerではエラーが起こる。

image.png

カスタムエラーページ

php artisan vendor:publish ̶tag=laravel-errors

views/errorsフォルダがコピーされる

公式

生成されたファイルからカスタム可能
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?