Spatie Laravel Permission là một package mạnh mẽ dành cho Laravel, được thiết kế để quản lý quyền (permissions) và vai trò (roles) trong các ứng dụng Laravel một cách dễ dàng. Nó cho phép bạn gắn vai trò vào người dùng và định nghĩa các quyền cho từng vai trò, giúp bạn kiểm soát truy cập theo cách chi tiết và hiệu quả.

Dưới đây là bài hướng dẫn chi tiết để cài đặt và sử dụng Spatie Laravel Permission:

1. Cài đặt Package

Bước 1: Cài đặt thông qua Composer

Bạn có thể cài đặt package này bằng lệnh Composer:

shell
composer require spatie/laravel-permission

Bước 2: Đăng ký Service Provider (bỏ qua bước này nếu sử dụng Laravel 9+)

Laravel tự động đăng ký service provider cho bạn. Nếu bạn đang dùng phiên bản Laravel cũ hơn, hãy thêm vào file config/app.php:

php
'providers' => [
    // ...
    Spatie\Permission\PermissionServiceProvider::class,
];

2. Cấu hình & Database

Bước 1: Xuất bản file config và migrations

Chạy lệnh sau để xuất bản file cấu hình và các file migration:

shell
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"

File cấu hình sẽ được tạo tại: config/permission.php.

Bước 2: Run migrations

Thực hiện lệnh sau để tạo các bảng cần thiết:

shell
php artisan migrate

Các bảng được tạo:

  • roles: Lưu thông tin các vai trò.
  • permissions: Lưu các quyền cụ thể.
  • model_has_roles: Liên kết người dùng với vai trò.
  • model_has_permissions: Liên kết người dùng với quyền.
  • role_has_permissions: Liên kết vai trò với quyền.

3. Thêm Traits vào Model

Thêm trait HasRoles vào model User của bạn để kích hoạt các chức năng của Spatie Laravel Permission:

php
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}

Bạn cũng có thể sử dụng package này với bất kỳ model nào, không chỉ riêng User.

4. Quản lý roles và permissions

Tạo role

Sử dụng lệnh Artisan:

shell
php artisan permission:create-role admin

Hoặc sử dụng trong code:

php
use Spatie\Permission\Models\Role;

$role = Role::create(['name' => 'admin']);

Tạo permission

Sử dụng lệnh Artisan:

shell
php artisan permission:create-permission edit articles

Hoặc sử dụng trong code:

php
use Spatie\Permission\Models\Permission;

$permission = Permission::create(['name' => 'edit articles']);

Gán permission cho role

php
$role->givePermissionTo('edit articles');

// Hoặc
$permission->assignRole('admin');

Gán role cho người dùng

php
$user = User::find(1);
$user->assignRole('admin');

Kiểm tra permission

Bạn có thể kiểm tra quyền hoặc vai trò dễ dàng:

php
if ($user->hasRole('admin')) {
    // Người dùng là admin
}

if ($user->can('edit articles')) {
    // Người dùng có quyền edit articles
}

5. Middleware bảo vệ Route

Package cung cấp các middleware sẵn để kiểm tra quyền hoặc vai trò.

Kiểm tra role

Thêm middleware vào route:

php
Route::group(['middleware' => ['role:admin']], function () {
    Route::get('/admin', [AdminController::class, 'index']);
});

Kiểm tra permission

php
Route::group(['middleware' => ['permission:edit articles']], function () {
    Route::get('/edit-article', [ArticleController::class, 'edit']);
});

Kết hợp nhiều roles hoặc permissions

Bạn có thể kết hợp logic kiểm tra với | (hoặc) và & (và):

php
Route::group(['middleware' => ['role:admin|editor']], function () {
    // Người dùng phải có vai trò admin hoặc editor
});

Route::group(['middleware' => ['permission:edit articles&delete articles']], function () {
    // Người dùng phải có cả hai quyền edit và delete articles
});

6. Tích hợp tùy biến

Thay đổi bảng Model

Nếu bạn không sử dụng model User mặc định, bạn có thể cấu hình trong config/permission.php:

php
'models' => [
    'user' => App\Models\CustomUser::class,
],

Bổ sung permission tự động

Bạn có thể định nghĩa các quyền mặc định và thêm chúng vào khi ứng dụng khởi động:

php
use Spatie\Permission\Models\Permission;

Artisan::command('setup:permissions', function () {
    $permissions = ['create articles', 'edit articles', 'delete articles'];

    foreach ($permissions as $permission) {
        Permission::firstOrCreate(['name' => $permission]);
    }

    $this->info('Quyền đã được thêm!');
});

7. Giao diện người dùng

Bạn có thể tạo một giao diện quản lý vai trò và quyền. Dưới đây là gợi ý cơ bản:

  1. Controller: Tạo controller để xử lý vai trò và quyền.
  2. View: Tạo form để thêm/xóa/sửa vai trò, quyền.
  3. Kết nối với route: Thêm route vào file web.php.

Kết luận

Spatie Laravel Permission là một package rất mạnh mẽ và linh hoạt, giúp bạn quản lý quyền và vai trò trong ứng dụng Laravel dễ dàng. Với hướng dẫn này, bạn đã có thể cài đặt và sử dụng cơ bản, cũng như tích hợp sâu hơn vào ứng dụng của mình.

Hy vọng bài viết hữu ích với bạn. Nếu có bất kỳ câu hỏi nào, hãy để lại bình luận bên dưới. Đừng quên theo dõi CodeTutHub để nhận thêm nhiều bài viết chất lượng về lập trình! 🎉