Laravel permission cho phép chúng ta chia ra 2 thành phần là Vai trò (role) và quyền (permission).
1.Cài đặt
- Cài đặt Laravel 5.8 hoặc cao hơn
- Nếu bạn đang có sẵn file
config/permission.php
bạn phải đổi tên hoặc xóa ngay, bởi vì khi setup thì package sẽ được publishes vàoconfig/permission.php
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:
composer require spatie/laravel-permission
Sau đó, trong config/app.php
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 migrate
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
Tạo file mới /database/seeds/PermissionsDemoSeeder.php và code như ví dụ bên dưới
use Illuminate\Database\Seeder; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; use Spatie\Permission\PermissionRegistrar; class PermissionsDemoSeeder extends Seeder { /** * Create the initial roles and permissions. * * @return void */ public function run() { // Reset cached roles and permissions app()[PermissionRegistrar::class]->forgetCachedPermissions(); // create permissions Permission::create(['name' => 'edit articles']); Permission::create(['name' => 'delete articles']); Permission::create(['name' =>; 'publish articles']); Permission::create(['name' => 'unpublish articles']); // create roles and assign existing permissions $role1 = Role::create(['name' > 'writer']); $role1->givePermissionTo('edit articles'); $role1->givePermissionTo('delete articles'); $role2 = Role::create(['name' => 'admin']); $role2->givePermissionTo('publish articles'); $role2->givePermissionTo('unpublish articles'); $role3 = Role::create(['name' => 'super-admin']); // gets all permissions via Gate::before rule; see AuthServiceProvider // create demo users $user = Factory(App\User::class)->create([ 'name' => 'Example User', 'email' => 'test@example.com', ]); $user->assignRole($role1); $user = Factory(App\User::class)->create([ 'name' => 'Example Admin User', 'email' => 'admin@example.com', ]); $user->assignRole($role2); $user = Factory(App\User::class)->create([ 'name' => 'Example Super-Admin User', 'email' => 'superadmin@example.com', ]); $user->assignRole($role3); } }
Tiếp theo khỏi tạo cơ sở dữ liệu
php artisan db:seed --class=PermissionsDemoSeeder
3.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 đó // nhiều quyền cùng lúc $user->givePermissionTo('edit articles', 'delete articles'); // dán 1 mảng $user->givePermissionTo(['edit articles', 'delete articles']); // xóa 1 quyền $user->revokePermissionTo('edit articles'); // thêm quyền $user->syncPermissions(['edit articles', 'delete articles']); //Kiểm tra quyền $user->hasPermissionTo('edit articles');
4.Trao quyền thông qua roles
Một roles có thể được trao cho bất cứ users
nào bằng cách :
$user->assignRole('writer'); // set nhiều vai trò $user->assignRole('writer', 'admin'); // dán 1 mảng $user->assignRole(['writer', 'admin']); // xóa vai trò $user->removeRole('writer'); //check xem vai tro đang cần tìm bằng cách : $user->hasRole('writer'); // thêm vai trò và clear các vai trò có sẳn từ trước $user->syncRoles('admin');
5.Sử dụng với middleware
Bạn có thể sử dụng can như một mặc định để giới hạn quyền truy cập cho trang web bằng cách :
Route::group(['middleware' => ['can:publish articles']], function () { // });
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 RoleMiddleware, PermissionMiddleware and RoleOrPermissionMiddleware. Để sử dụng, bạn cần thêm vào app/Http/Kernel.php file như sau:
protected $routeMiddleware = [ // ... 'role' => \Spatie\Permission\Middlewares\RoleMiddleware::class, 'permission' => \Spatie\Permission\Middlewares\PermissionMiddleware::class, 'role_or_permission' => \Spatie\Permission\Middlewares\RoleOrPermissionMiddleware::class, ];
Sau đó chúng ta có thể sữ dung các route:
// Chỉ có role là super-admin mới có thể truy cập vào các route của group này Route::group(['middleware' => ['role:super-admin']], function () { // }); // Chỉ có permission là publish articles thì mới có thể truy cập vào các route của group này Route::group(['middleware' => ['permission:publish articles']], function () { // }); // Chỉ có role là super-admin hoặc permission là publish articles thì mới có thể truy cập vào các route của group này Route::group(['middleware' => ['role:super-admin','permission:publish articles']], function () { // }); Route::group(['middleware' => ['role_or_permission:super-admin|edit articles']], function () { // }); // Đối với GET; Route::get('/admin', function(){ return view('admin.dashboard'); })->name('admin')->middleware('auth')->middleware(['role:administrator']); // auth để kiềm tra đăng nhập và role để kiểm tra vai trò. // Tất cả những quyền không được phép truy cập sẽ mặc định trả về page 403:
6.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 @can
, @cannot
, @canany
, and @guest
để 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:
@can('edit articles') // @endcan // hoặc @if(auth()->user()->can('edit articles') && $some_other_condition) // @endif // hoặc @role('writer') I am a writer! @else I am not a writer... @endrole // Kiem tra nhiều hơn như sau: @hasanyrole($collectionOfRoles) Tôi có một hoặc nhiều roles trong điều kiện này @else Tôi không thuộc roles nào ở trên @endhasanyrole // hoặc @hasanyrole('writer|admin') Tôi là một writer hoặc admin hoặc cả hai :D @else Tôi không là writer cũng không là admin @endhasanyrole
Vừa rồi mình đã giới thiệu 1 số vấn đề cớ bản trong việc sử dụng package spatie/laravel-permission
trong Laravel để làm tính năng phân quyền. Mong các bạn có thể áp dụng dễ dàng.
Chúc các bạn ngày vui vẻ.
Leave a Reply