Check User, Role, Permission relationship in Laravel 8

min read

Day 28/100 #100DaysOfCode #Laravel8

Hôm này mình thực hiện việc kiểm tra mối quan hệ (User, Role, Permission) in Laravel 8. Thông thường khi mình xây dựng một website cũng phải có phần quản lý việc người dùng đăng nhập vào hệ thống có một số quyền hạn gì?, cho người dùng đó những chức năng gì?

 

Chúng ta nói rằng : 

- User chỉ có một vai trò(Role), một vai trò(Role) có nhiều người dùng(Users)

- Vai trò(Role) có nhiều quyền(Permissions), đồng thời quyền(Permission) có thuộc nhiều vai trò(Roles)

Okay, chúng ta xây dụng mô hình nó như sau:

* Chạy mấy cái Migration dưới đây

//cmd migration
php artisan make:migration create_role_table --create=roles

//update function up()
Schema::create('roles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        
 });

+ Tiếp tục tạo khóa ngoại in table users

// run cmd migration add key role to user
 php artisan make:migration create_user_table --table=users

//update up() function
 Schema::table('users', function (Blueprint $table) {
            $table->unsignedBigInteger('role_id')->default(3);
            $table->foreign('role_id')->references('id')->on('roles');
        });

+ Tạo table permissions

//run migration
php artisan make:migration create_permission_table --create=permissions

//update up() function
 Schema::create('permissions', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();

       });

 

+ Tạo khóa liên kết giữa table (Role & Permission)

//run migration role_permission 
php artisan make:migration create_role_permission_table --create=role_permision

//update up() function
Schema::create('role_permission', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('role_id');
            $table->unsignedBigInteger('permission_id');
            $table->foreign('role_id')->references('id')->on('roles');
            $table->foreign('permission_id')->references('id')->on('permissions');

        });

Okay, chúng ta cần table mối quan hệ giữ các table trước, giờ ta cần tạo model để thiết kế mối quan hệ(many-to-many, one-to-many) 

php artisan make:model Role
php artisan make:model Permission

+ Thiếp lập mối quan hệ giữa User & Role : 

- App/Models/Users.php 

 public function role(){
        return $this->belongsTo(Role::class);
   }

- App/Models/Role.php

 public function users(){
        return $this->hasMany(User::class);
    }
 public function permissions(){
        return $this->belongsToMany(Permission::class,'role_permission');
    }

- App/Models/Permission.php

  public function roles(){
        return $this->belongsToMany(Role::class,'role_permission');
    }

Tạo file Controller để test nó thôi

Example :  php artisan make:controller Admin/UsersController  --resource

Open App/Http/Controllers/Admin/UsersController.php 

use App\Models\Role;
use App\Models\User;
use App\Models\Permission;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
use Illuminate\Support\Collection;
 public function index()
    {
        $user_id = Auth::user()->id;
        $data = Auth::user()->role->permissions;
        $arrPermission = [];
        foreach($data as $value) $arrPermission[] = $value->name; 
        $collection = new Collection($arrPermission);
        dd($collection->contains("all_product"));
 }

Tạo route check nó thôi, routes/web.php

Route::get('/test/user', [App\Http\Controllers\Admin\UsersController::class,"index"])->name("user.index");

Nếu bạn muốn kiểm tra quyền trong template blade , bạn sử dụng như sau, hãy mở file bên dưới và thêm code sau

- App\Models\Permission.php

use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
 public function checkPermission($permission){
        $data = Auth::user()->role->permissions;
        $arrPermission = [];
        foreach($data as $value) $arrPermission[] = $value->name; 
        $collection = new Collection($arrPermission);
        if($collection->contains($permission)){
            return true;
        }
        return false;
    }

- Mở Views/Admin/all-product.blade.php : kiểm tra quyền như đoạn code sau : 

@php 
use App\Http\Controllers\Admin\UsersController;
use App\Models\Permission;
$permission = new Permission;
@endphp

@section("content")
         @if($permission->checkPermission('edit_product'))
                   <a class="edit" href="{{route('products.edit',$product->id)}}" target="_blank"><i class="far fa-edit"></i></a>
         @else
                  <a style="color:red"><i class="fas fa-exclamation-triangle"></i>
         @endif

@endsection

Vậy là xong nhé!