การติดตั้ง 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
php artisan laratrust:setup-teams
3. รัน migrate
php artisan migrate
สำหรับใครอ่านที่ถึงตรงนี้แล้ว ยินดีด้วยครับการติดตั้ง Laratrust ของคุณเสร็จเรียบร้อยแล้ว เย้ๆๆ แต่นี่เป็นแค่ครึ่งทางเท่านั้น เพราะอีกครึ่งทางที่เหลือคือการใช้งาน Laratrust ซึ่งมี method ให้ใช้ได้หลายอย่างมาก รวมทั้งตัวอย่างการใช้งานในกรณีต่างๆ อีกเพียบ
ดังนั้นจึงขอแยกเป็นเรื่อง ๆ เพื่อให้ง่ายในการกลับมาดูอีกครั้งนึง และบล็อคนี้ได้ไม่ยาวเกินไปด้วยแหละ เอาหล่ะไปพักสายตาแปป แล้วเจอกันนะครับ :)
Originally published at www.ideagital.com.