laravel-permission เป็น package สำหรับจัดการ roles และ permissions ของ user ใน database
วิธีการติดตั้ง
- สั่งติดตั้ง laravel-permission package
composer require spatie/laravel-permission
- สร้างไฟล์ migration ของ package ใน project
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
- รัน migrate เพื่อสร้างตารางในฐานข้อมูล
php artisan migrate
- สร้างไฟล์ config ของ package ใน project
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
วิธีการตั้งค่า User model
- เพิ่ม
use Spatie\Permission\Traits\HasRoles;
ไว้ที่ส่วนบนของไฟล์ User Model
- เพิ่ม
use HasRoles;
ไว้ภายใน class ของ User Model
<?php
namespace App\Models;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable
{
...
use HasRoles;
...
}
วิธีการเตรียม Seeder สำหรับ Permissions และ Roles
- สร้างไฟล์ config/authorize_matrix.php สำหรับเก็บ permissions และ roles โดยมีตัวอย่างดังนี้
<?php
return [
'permissions' => [
'a',
'b',
'c',
'd',
],
'roles' => [
'admin' => [],
'maker' => [
'a',
],
'reviewer' => [
'b',
],
'approver' => [
'c',
'd',
],
],
];
- สร้างไฟล์ database\seeds\RolesAndPermissionsSeeder.php เพื่ออ่านค่าจากไฟล์ config มาเก็บลง Database
<?php
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;
class RolesAndPermissionsSeeder extends Seeder
{
public function run()
{
// Reset cached roles and permissions
app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();
$authorizeMatrix = config('authorize_matrix');
// create permissions
foreach ($authorizeMatrix['permissions'] as $permission) {
$existPermission = Permission::where(['name' => $permission])->first();
if (empty($existPermission)) {
Permission::create(['name' => $permission]);
}
}
// create roles and assign created permissions
foreach ($authorizeMatrix['roles'] as $role => $permissions) {
$existRole = Role::where(['name' => $role])->first();
if (empty($existRole)) {
$existRole = Role::create(['name' => $role]);
}
if ($role == 'admin') {
$existRole->givePermissionTo($authorizeMatrix['permissions']);
} else {
$existRole->givePermissionTo($permissions);
}
}
}
}
ตัวอย่างการใช้งาน
- เพิ่ม admin role ให้ User
$user->syncRoles(['admin']);
ตรวจสอบ permission ของ user
$user->can('a'); // true or false
เพิ่มการตรวจสอบ permission ของ user ใน route middleware
Route::get('projects', 'Projects\ProjectController@index')->middleware('can:projects.view');
Route::group(['middleware' => ['can:projects.edit']], function () {
Route::get('projects/{id}', 'Projects\ProjectController@getProject');
Route::post('projects/{id}', 'Projects\ProjectController@updateProject');
});
No comments:
Post a Comment