Hướng dẫn role permission in php - quyền vai trò trong php

Như các bạn đã biết, phân quyền trong một ứng dụng là một phần không thể thiếu trong việc phát triển phần mềm, dù đó là ứng dụng web hay là mobile. Vậy nên, hôm nay mình sẽ giới thiệu một package có thể giúp các bạn phân quyền nhanh và đơn giản trong một website được viết bằng PHP với framework là Laravel. Đó là package laravel-permission.

1. Cài đặt Laravel Permission

Laravel permission cho phép chúng ta có thể dễ dàng phân chia các vai trò (roles) và quyền (permissions) dùng để quản lý quyền hạn truy cập trong một trang web. Để cài đặt package này, chúng ta cần:

  • Cài đặt Laravel 5.8 hoặc cao hơn
  • Nếu bạn đang có sẵn file
    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
    
    6 bạn phải đổi tên hoặc xóa ngay, bởi vì khi setup thì package sẽ được publishes vào
    php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
    
    6

Nếu thỏa mãn 2 điều kiện trên rồi chúng ta chạy câu lệnh dưới nhé :

composer require spatie/laravel-permission

Sau đó, trong

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
8 chúng ta add service provide cho package như sau:

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

Sau đó, publish migration thông qua lệnh:

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

Chạy lệnh

php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
9 và chúng ta sẽ có các bảng như roles, permissions, role_has_permissions, model_has_roles và model_has_permission

2. Tạo Roles và Permissions

Đầu tiên add trait của

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
0 vào
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
1 model(s):

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}

Sau đó chúng ta thêm các vai trò (roles) và quyền (permissions), một role có thể có nhiều permission. Chúng ta làm như sau:

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

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

Như trên các bạn đã thấy, mình vừa tạo ra một Role có tên là

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
2 và một Permission là
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
3

Để trao quyền

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
3 cho vai trò
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
2, chúng ta làm như sau:

$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);

Để lấy thông tin tất cả các

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
6 có role là
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
2 chúng ta làm như sau:

$users = User::role('writer')->get()

hoặc trả về các user có quyền truy cập

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
3

$users = User::permission('edit articles')->get();

3. Ứng dụng

3.1. Trao quyền trực tiếp cho một user

Bạn có thể giao một quyền cho một user như sau:

$user->givePermissionTo('edit articles'); // giao quyền edit articles cho một user nào đó

bạn cũng có thể giao nhiều quyền user trong một lần hoặc có thể sử dụng mảng:

// You can also give multiple permission at once
$user->givePermissionTo('edit articles', 'delete articles');

// You may also pass an array
$user->givePermissionTo(['edit articles', 'delete articles']);

Để xóa một quyền khỏi một

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
9 nào đó, chúng ta làm như sau :

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

hoặc xóa và thêm mới một quyền khác chẳng hạn:

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

Bạn cũng có thể check xem liệu một

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
9 có một quyền nào đó hay không:

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

Và còn một số option khác, các bạn có thể tham khảo thêm tại đây.

3.2. Trao quyền thông qua roles

Một roles có thể được trao cho bất cứ

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
6 nào bằng cách :

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

bạn cũng có thể giao nhiều

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
2 cho
use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
9 trong một lần hoặc có thể sử dụng mảng:

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

Hoặc để xóa một role khỏi một user, chúng ta chỉ cần làm như sau:

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

Bạn cũng có thể check xem liệu

use Illuminate\Foundation\Auth\User as Authenticatable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasRoles;

    // ...
}
9 có phải là
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
5 đang cần tìm bằng cách :

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

hoặc liệu có ít nhất một trong các roles trên thì chúng ta chỉ việc truyền mảng vào như sau:

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

Và còn một số option thông dụng khác các bạn có thể tham khảo thêm tại đây.

3.3. Sử dụng với middleware

Bạn có thể sử dụng

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
6 như một mặc định để giới hạn quyền truy cập cho trang web bằng cách :

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

Hoặc nếu bạn không muốn sử dụng mặc định, Laravel permission mang đến cho chúng ta các middleware

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
7,
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
8 and
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
9. Để sử dụng, bạn cần thêm vào
$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);
0 file như sau:

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

Sau đó sử dụng chúng để kiểm tra các route thôi nào :

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

Tất cả những quyền không được phép truy cập sẽ mặc định trả về page 403: Chúng ta cũng có thể tham khảo thêm các option khác khi làm việc với middleware tại đây.

Hướng dẫn role permission in php - quyền vai trò trong php
Chúng ta cũng có thể tham khảo thêm các option khác khi làm việc với middleware tại đây.

3.4. Sử dụng trực tiếp trên Blade

Đối với phần view, để hiển thị view tương ứng cho các vai trò, chúng ta có thể sử dụng

$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);
1,
$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);
2,
$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);
3, and
$role->givePermissionTo($permission);
//hoặc...
$permission->assignRole($role);
4 để kiểm tra việc xem thông tin hiển thị trên một trang web. Chúng ta làm như sau:

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

hoặc

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

Bạn cũng có thể dùng

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
5 để check việc này:

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

hoặc

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

Bạn cũng có thể dùng

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
5 để check việc này:

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

Chúng ta có thể linh hoạt trong việc check nhiều

use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

$role = Role::create(['name' => 'writer']);
$permission = Permission::create(['name' => 'edit articles']);
2 hơn như sau:

Bạn có thể xem thêm những option khác để đa dạng việc sử dụng roles và permissions trong blade tại đây.

4. Kết luận

Vừa rồi, mình đã giới thiệu và hướng dẫn sử dụng một số tính năng mà mình cho là quan trọng, cơ bản và cần có nhất trong việc sử dụng package $role->givePermissionTo($permission); //hoặc... $permission->assignRole($role); 7 để phân quyền trong một ứng dụng web chạy bằng framework Laravel. Hy vọng qua bài viết này, các bạn có thể dễ dàng hình dung hơn để áp dụng vào việc phân quyền cho trang web của mình một cách đơn giản và nhanh chóng nhất. Cảm ơn các bạn đã đọc bài viết này, hẹn gặp lại các bạn vào những bài viết tiếp theo

https://docs.spatie.be/laravel-permission/v3/introduction/