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é!