Роли и права в Laravel

Всем привет, подскажите пожалуйста, нужно реализовать роли и права пользователей. Есть всего 2 роли, покупатель и продавец, у каждого из них есть лк, как это в бд лучше организовать и как разрешить одной роли делать определенные действия а другой нет? Никогда с ролями не работал


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

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

Создайте в таблице с пользователями новое поле is_admin, ставьте значение true, если пользователь является администратором и false, если это обычный покупатель. При каждом запросе проверяйте (с помощью запроса к бд), админ ли этот пользователь

→ Ссылка
Автор решения: Alexandr Revnuk

Самый простой вариант, без пайвот модели:

  1. В Users создаешь role
  2. При создании юзера - присваивать роль. Допустим роли будут находиться даже не в базе данных а здесь - app/Enumarators/UserEnumerator.php

UserEnumerator.php:

<?php

namespace App\Enumerators;


class UsersEnumerator
{
    public const USER_ROLE_EMPLOYER = 1;
    public const USER_ROLE_ADMINISTRATOR = 2;
 

    public static function getTypes()
    {
        return [
            self::USER_ROLE_EMPLOYER => 'Работник',
            self::USER_ROLE_ADMINISTRATOR => 'Админ',
        ];
    }
}

Допустим у нас есть контроллер CabinetController с методом show, где мы смотрим какой блейд показать.

public function show()
{
   //code there...

   if(auth()->user()->role == UsersEnumerator::USER_ROLE_ADMINISTRATOR ) {
        return view('cabinetAdmin');
   }
   
   return view('cabinetUser');
}

Для простой проверки, можно создать сервис в app/Service/CheckAdminService.php

namespace App\Services;

use Ramsey\Uuid\Type\Integer;
use App\Enumerators\UsersEnumerator;

class CheckAdminService
{
    public static function check(User $user)
    {
        return (UsersEnumerator::USER_ROLE_ADMINISTRATOR === auth()->user()->role);
    }
}

Досутуп до ссылок можно сделать с помощью middleware CheckAdmin

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use App\Services\CheckAdminService

class CheckAdmin
{
    
    public function handle(Request $request, Closure $next)
    {
        if(CheckAdminService::check(auth()->user()) {
            return $next($request);
        }

        return abort(404);
    }
}

и конечно же не забыть в Kernel.php

protected $routeMiddleware = [
        //code...
        'checkAdmin' => \App\Http\Middleware\CheckAdmin::class,
    ];

Пример пользования:

Route::get('/add-somethin', 'SomeController@add')->middleware(['checkAdmin'])
→ Ссылка