background

การติดตั้ง Laratrust ตัวจัดการเรื่องสิทธิ์การใช้งาน (ACL)

11 months ago ◦ 1,909 Views

การติดตั้ง Laratrust ตัวจัดการเรื่องสิทธิ์การใช้งาน (ACL)

การติดตั้ง Laratrust ตัวจัดการเรื่องสิทธิ์การใช้งาน (ACL)

Laratrust เป็นแพคเกจสำหรับ Laravel 5 ที่ช่วยให้เราจัดการเรื่องสิทธิ์การใช้งานแบบ ACL โดยเราสามารถกำหนด Role, Permission และ Team เพื่อจัดการการเข้าถึงได้อย่างยืดหยุ่น 


ติดตั้ง Laratrust Package

1. รันคำสั่ง composer require ในโปรเจค Laravel ของเรา ด้วย Terminal

composer require "santigarcor/laratrust:5.0.*"


(สำหรับใครที่ใช้ Laravel 5.5 ขึ้นไป ข้ามไปข้อ 4 ได้เลยครับ)

2. เข้าไปเพิ่ม LaratrustServiceProvider ที่อาเรย์ providers ในไฟล์ config/app.php

Laratrust\LaratrustServiceProvider::class,


3. และเพิ่ม Laratrust ที่อาเรย์ aliases ด้านล่างของไฟล์ด้วยนะ

 'Laratrust'   => Laratrust\LaratrustFacade::class,           


4. รันคำสั่งเปิดใช้ไฟล์ config ของ laratrust ทั้งหมดครับ

php artisan vendor:publish --tag="laratrust"

(ถ้าหากรันคำสั่งด้านบนแล้วไม่มีอะไรตอบสนอง ให้เคลียแคช config ของเราก่อนครับ)

php artisan config:clear


ตั้งค่าในไฟล์ Config

ตอนนี้เราจะได้ไฟล์ config/laratrust.php สำหรับตั้งค่าต่าง ๆ ของ laratrust ดังนี้

ถ้าต้องการสร้างสิทธิ์ผู้ใช้แบบทีมก็ให้เปิดใช้ฟีเจอร์นี้ตรงบรรทัดนี้

use_teams => true

ปกติ Laratrust จะเซ็ตโมเดล User เป็นโมเดลหลักอันเดียว กรณีมีหลาย User โมเดลก็เพิ่มอาเรย์เป็นชื่อโมเดลต่อลงไปได้เลย

'user_models' => [
    'users' => 'App\User',     ...
],

ตอนเรียกใช้ก็เรียก method ตาม key ที่เราตั้งแบบนี้

$role->users;
$role->users();


ติดตั้งแบบอัตโนมัติ (แนะนำ)

เมื่อ Config เสร็จแล้ว ต่อจากนี้ก็จะเป็นขึ้นการของติดตั้งเข้าโปรเจคของเรา ถ้าต้องการให้ Laratrust ทำการติดตั้งตัวเองอัตโนมัติ ก็แค่รันคำสั่งนี้ครับ

php artisan laratrust:setup

คำสั่งนี้ก็จะ Generate ไฟล์ model และ migration มาให้ครับ (ถ้าเปิดใช้ฟีเจอร์ทีมก็จะมีโมเดล Team มาให้ด้วย) และอย่าลืม dump-autoload ใหม่ด้วยนะ

composer dump-autoload


สร้าง Migration

โดยใช้คำสั่งสร้าง migration ของ laratrust ตามนี้ครับ

php artisan laratrust:migration

จะได้ไฟล์ ชื่อ แล้วเราก็รันคำสั่ง migrate ได้เลย

php artisan migrate

เสร็จแล้วเราจะได้ตารางในฐานข้อมูลเพิ่มขึ้นตามนี้

- roles                           ไว้เก็บชื่อ role เช่น admin, user
- permissions                ไว้เก็บชื่อ permission
- teams                         ไว้เก็บชื่อ team (ถ้าต้ังค่า use_teams = true)
- role_user                    ไว้ความสัมพันธ์ของตาราง roles และ users
- permission_role          ไว้เก็บความสัมพันธ์ Many to Many ของ roles กับ permissions
- permission_user         ไว้เก็บความสัมพันธ์ของตาราง users กับ permissions


สร้างโมเดล Role

ตอนนี้เราก็จะไล่สร้าง Model ที่เราจำเป็นต้องไว้ครับเริ่มจากสร้างไฟล์โมเดลใหม่ในโฟลเดอร์ app ตั้งชื่อว่า app/Role.php แล้วเขียนโค้ดตามนี้

namespace  App;
use Laratrust\Models\LaratrustRole;
class Role extends LaratrustRole
{
}

สำหรับโมเดล Role จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์
- name                ชื่อที่ใช้เรียก Role แบบไม่ซ้ำกัน เช่น "admin", "owner", "employee"
- display_name   ชื่อ Role แบบแสดงให้คนอ่าน เช่น User "Administrator", "Employee"
- description        รายละเอียดของแต่ละ Role (ค่าเริ่มต้นเป็น null)


สร้างโมเดล Permission

ในโฟลเดอร์ app ให้สร้างไฟล์อีกไฟล์นึงชื่อ Permission.php แล้วเขียนโค้ดตามนี้

namespace App;
use Laratrust\Models\LaratrustPermission;
class Permission extends LaratrustPermission
{
}

สำหรับโมเดล Permission จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์ เช่นกัน
- name                ชื่อที่ใช้เรียก Permission แบบไม่ซ้ำกัน เช่น "create-post"
- display_name   ชื่อ Permission แบบแสดงให้คนอ่าน เช่น User "Create Posts"
- description        รายละเอียดของแต่ละ Permission (ค่าเริ่มต้นเป็น null)


สร้างโมเดล Team (ถ้าเปิดใช้งาน)

ในโฟลเดอร์ app ให้สร้างไฟล์ชื่อ Team.php แล้วเขียนโค้ดตามนี้

namespace App;
use Laratrust\Models\LaratrustTeam;
class Team extends LaratrustTeam
{
}

สำหรับโมเดล Team จะมีแอททริบิวต์หลักมาให้ 3 แอททริบิวต์
- name                ชื่อที่ใช้เรียก Team แบบไม่ซ้ำกัน เช่น "my-team"
- display_name   ชื่อ Team แบบแสดงให้คนอ่าน เช่น User "My Team"
- description        รายละเอียดของแต่ละ Team (ค่าเริ่มต้นเป็น null)


ตั้งค่าในโมเดล User

ตรงนี้เราจะมีโมเดล User อยู่แล้ว ให้เราเข้าไปเพิ่ม LaratrustUserTrait ในไฟล์ app/User.php ตามตัวอย่างนี้

use Laratrust\Traits\LaratrustUserTrait;

class User extends Model
{
   use LaratrustUserTrait; // เรียกใช้ trait
   ...
}

เราก็จะสามารถใช้ความสัมพันธ์ของ Role และ Permission ด้วย method เหล่านี้ roles(), hasRole($name), hasPermission($permission), isAbleTo($permission), can($permission), ability($roles, $permissions, $options) และ rolesTeams()

ที่สำคัญอย่าลืม dump autoload ใหม่ด้วย

composer dump-autoload


สร้าง Seeder

มาถึงนี้เราก็มีโครงสร้างพร้อมใช้งานแล้วแหละ แต่ขาดข้อมูลเริ่มต้นชื่อ Role, Permission ที่เราจะมีไว้ใช้ก่อนนั่นเอง โดยการรันคำสั่งสร้าง seeder ของ laratrust 

php artisan laratrust:seeder

และเช่นเคย

composer dump-autoload

เสร็จแล้วก็ไปเพิ่มคำสั่งสำหรับรัน method ในไฟล์ database/seeds/DatabaseSeeder.php

$this->call(LaratrustSeeder::class);

(** ถ้าเราไม่ได้รันคำสั่ง php artisan vendor:publish --tag="laratrust" ตั้งแต่แรก เราต้องจัดการ roles, modules และ permissions เองแต่ละอันครับ)

ตอนนี้ในไฟล์ config/laratrust_seeder.php จะมีหน้าแบบนี้

return [
    'role_structure' => [
        'superadministrator' => [
            'users' => 'c,r,u,d',
            'acl' => 'c,r,u,d',
            'profile' => 'r,u'
        ],
        'administrator' => [
            'users' => 'c,r,u,d',
            'profile' => 'r,u'
        ],
        'user' => [
             'profile' => 'r,u'
        ],
    ],
    'permission_structure' => [
        'cru_user' => [
            'profile' => 'c,r,u'
        ],
    ],
    ...
];

ทำความเข้าใจกับ role_structure ในอาเรย์ด้านบนนี้
- ชั้นบนสุดคือชื่อ Role
- ชั้นรองลงมาคือโมดูลสำหรับใช้งานแต่ละส่วน
- ในแต่ละโมดูลจะมีการระบุชื่อ permission ที่อนุญาตแบบย่อสั้น ๆ

ส่วนใน permission_structure คือ
- ชั้นบนสุดคือชื่อ users
- ชั้นรองลงมาคือโมดูลสำหรับใช้งานแต่ละส่วน
- ในแต่ละโมดูลจะมีการระบุชื่อ permission ที่อนุญาตแบบย่อสั้น ๆ

ถ้าต้องการใช้คำย่ออื่นที่ไม่ใช่ c, r, u, d ตามที่มีมาให้ ก็ให้เข้าไปปรับเองที่ config/laratrust_seeder.php ตรงอาเรย์ permission_map ครับ


ติดตั้งตัวจัดการ Team (ถ้าเปิดใช้)

1. ตั้งค่า use_teams เป็น true ในไฟล์ config/laratrust.php

2. รันคำสั่งติดตั้ง

php artisan laratrust:setup-teams


3. รัน migrate

php artisan migrate



สำหรับใครอ่านที่ถึงตรงนี้แล้ว ยินดีด้วยครับการติดตั้ง Laratrust ของคุณเสร็จเรียบร้อยแล้ว เย้ๆๆ แต่นี่เป็นแค่ครึ่งทางเท่านั้น เพราะอีกครึ่งทางที่เหลือคือการใช้งาน Laratrust ซึ่งมี method ให้ใช้ได้หลายอย่างมาก รวมทั้งตัวอย่างการใช้งานในกรณีต่างๆ อีกเพียบ

ดังนั้นจึงขอแยกเป็นเรื่อง ๆ เพื่อให้ง่ายในการกลับมาดูอีกครั้งนึง และบล็อคนี้ได้ไม่ยาวเกินไปด้วยแหละ เอาหล่ะไปพักสายตาแปป แล้วเจอกันนะครับ :)




#laravel #php #laratrust #acl

View count: 1,909
  • avatar
  • Save Pongsiri ศิลปินด้านพัฒนาซอฟต์แวร์ มีเป้าหมายคือพัฒนาตัวเองให้ยืดหยุ่นที่สุด ชอบความเรียบง่าย,ดนตรี,กีฬา และแมว