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

Save Pongsiri
ideagital
Published in
3 min readMay 29, 2018

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.

--

--

Save Pongsiri
ideagital

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