Роли и права в Laravel
Всем привет, подскажите пожалуйста, нужно реализовать роли и права пользователей. Есть всего 2 роли, покупатель и продавец, у каждого из них есть лк, как это в бд лучше организовать и как разрешить одной роли делать определенные действия а другой нет? Никогда с ролями не работал
Ответы (2 шт):
Создайте в таблице с пользователями новое поле is_admin, ставьте значение true, если пользователь является администратором и false, если это обычный покупатель. При каждом запросе проверяйте (с помощью запроса к бд), админ ли этот пользователь
Самый простой вариант, без пайвот модели:
- В
Usersсоздаешьrole - При создании юзера - присваивать роль. Допустим роли будут находиться даже не в базе данных а здесь -
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'])