Menu

Thursday, November 21, 2019

[Laravel - Package] วิธีการติดตั้งและตั้งค่า Laravel Permission
[Laravel - Package] How to Install and Config Laravel Permission

laravel-permission เป็น package สำหรับจัดการ roles และ permissions ของ user ใน database

วิธีการติดตั้ง

  1. สั่งติดตั้ง laravel-permission package
  2. composer require spatie/laravel-permission
  3. สร้างไฟล์ migration ของ package ใน project
  4. php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="migrations"
    
  5. รัน migrate เพื่อสร้างตารางในฐานข้อมูล
  6. php artisan migrate
    
  7. สร้างไฟล์ config ของ package ใน project
  8. php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider" --tag="config"
    

วิธีการตั้งค่า User model 

  1. เพิ่ม use Spatie\Permission\Traits\HasRoles; ไว้ที่ส่วนบนของไฟล์ User Model
  2. เพิ่ม use HasRoles; ไว้ภายใน class ของ User Model
  3. <?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

  1. สร้างไฟล์ config/authorize_matrix.php สำหรับเก็บ permissions และ roles โดยมีตัวอย่างดังนี้
  2. <?php
    return [
        'permissions' => [
            'a',
            'b',
            'c',
            'd',
        ],
        'roles' => [
            'admin' => [],        
            'maker' => [
                'a',
            ],
            'reviewer' => [
                'b',
            ],
            'approver' => [
                'c',
                'd',
            ],
        ],
    ];
    
    
    
  3. สร้างไฟล์ database\seeds\RolesAndPermissionsSeeder.php เพื่ออ่านค่าจากไฟล์ config มาเก็บลง Database
  4. <?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