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ẻ.
192 thoughts on “Phân quyền trong Laravel với Laravel permission”
Comments are closed.