• Về tôi
  • Chính sách riêng tư
  • Liên hệ

HoangThuc.com

Website Developer

  • Trang chủ
  • WordPress
    • Plugin wordpress
  • Lập trình
    • Php
  • Thủ thuật máy tính
You are here: Home / Blog / Phân quyền trong Laravel với Laravel permission

Phân quyền trong Laravel với Laravel permission

4 August, 2020 by Hoàng Thức Leave a Comment

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ào config/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ẻ.

 

Bài viết khác

  • Chuyển thư mục public sang public_html trong Laravel khi deployChuyển thư mục public sang public_html trong Laravel khi deploy
  • Cài đặt nhiều phiên bản PHP DirectAdminCài đặt nhiều phiên bản PHP DirectAdmin
  • Backup mã nguồn, files, folders bằng phpBackup mã nguồn, files, folders bằng php
  • Hàm bỏ dấu tiếng việt trong phpHàm bỏ dấu tiếng việt trong php
  • Dùng hàm preg_match lấy html từ website khácDùng hàm preg_match lấy html từ website khác
  • Plugin lấy tin tự động từ website khácPlugin lấy tin tự động từ website khác
Share

Bình luận

Bình luận

Filed Under: Blog, Laravel, Php Tagged With: Laravel, Php

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Bài viết mới

> 2021/10/11 19:10:10 [INFO] acme: Registering account for admin@X.X.X.X>

  • Dữ liệu JSON trong MySQL
  • Chuyển thư mục public sang public_html trong Laravel khi deploy
  • Fix “Requested icu-uc 50.1 but version of icu-uc is” trên DirectAdmin

FOLLOW ME

  • Facebook
  • Google+
  • Twitter

Danh mục

  • Blog
  • Lập trình
  • Laravel
  • MYSQL
  • Php
  • Thủ thuật máy tính
  • Vps
    • DirectAdmin
  • Wordpress
    • Plugin wordpress
    • Wordpress căn bản
    • Wordpress nâng cao
      • Custom post wordpress

Archives

  • October 2021
  • January 2021
  • December 2020
  • November 2020
  • September 2020
  • August 2020
  • September 2019
  • August 2019
  • July 2019
  • June 2018
  • August 2017
  • July 2017
  • June 2017
  • May 2017
  • March 2017
  • November 2016
  • September 2016
  • July 2016
  • June 2016
  • May 2016
  • April 2016
  • March 2016
  • January 2016
  • December 2015
  • May 2015
  • April 2015
Copyright © 2022 · HoangThuc.com · Genesis Framework