Уровни пользователей. Laravel.Fortify(и не только)

Есть ли готовый функционал в пакете Fortify для настройки уровня доступа пользователей (обычный пользователь, админ, главный админ). Если нет, тот как это можно правильно реализовать? Как вариант создать middleware и поле is_admin в таблице users. И проверять:

if(Auth::user()->is_admin != 1){
return redirect()->route('index');
}

Route:

Route::group(['middleware' => 'id_admin'], function(){

    Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
    
  });

Это, вроде, еще легко, если у меня 2 уровня доступа (0 - обычный пользователь, 2 - админ). А что если больше? Например 3. Обычный пользователь, админ (может редактировать, обновлять удалять товары и категории) и главный админ (может отбирать и назначать админами других пользователей, редактировать их данные, удалять и т.д.). Стоит ли создать второй middleware и проверять уровень пользователя, все у кого значение 'is_admin' не равно 2 не пускать в страницу редактирования?

Route для второго middleware:

Route::group(['middleware' => 'id_admin'], function(){

    Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');
      Route::group(['middleware' => 'id_ceo'], function(){
          Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->name('ceo_panel');
      });
  });

Но как то бредово 2 middleware для одной цели. Может быть кто то что то посоветует?


Ответы (1 шт):

Автор решения: Hi_TecH

Т.к. готового решения в Fortify нет, пришлось писать функционал самому.

С помощью этого ответа я нашел решение для моего случая. У меня есть 3 уровня доступа:

0 - обычный пользователь,

1 - администратор,

2 - CEO.

В модели User я написал следующее:

public function hasRole(){
      if($this->role === 2){
        return 1&&2;
      }else if($this->role === 1){
        return 1;
      }else{
        return redirect()->back();
      }
    }

Role middleware:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class Role
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
     public const Admin = '1';
     public const CEO = '2';
     public function handle(Request $request, Closure $next, ... $roles){
         $user = Auth::user();
         
         $role = Auth::user()->role;

         if (!in_array($user->hasRole(), $roles)) {
           return redirect()->back();
        }

        return $next($request);
     }

}

App\Http\Kernel.php:

protected $routeMiddleware = [
   ...
   'role' => \App\Http\Middleware\Role::class,
   ...
];

Routes:

Route::group(['middleware' => 'auth'], function(){

  Route::group(['middleware' => 'role:Admin,CEO'], function(){

      Route::get('/ceo-panel', [AdminController::class, 'ceo_panel'])->middleware('role:CEO')->name('ceo_panel');

      Route::get('/admin-panel', [AdminController::class, 'admin_panel'])->name('admin_panel');

  });

});

Надеюсь это кому-нибудь будет полезным!

→ Ссылка