Как проверить права пользователя в Laravel?

Здравствуйте! Есть заказы Orders и пользователи Users. User может просматривать только свои Orders, но если он админ(поле с булевым значением в таблице users - isAdmin), то может просматривать также и Orders других пользователей
Route::get('/{user}/orders', 'OrdersController@index')->name('orders.index');

В контроллере пытаюсь ограничить доступ, но что то делаю не так
if (auth()->id() != $user->id || !auth()->user()->isAdmin) {
    abort(403);
}

Если оставить только первую часть сравнения, то работает как ожидается, но только для обычного юзера который не может смотреть чужие заказы
if (auth()->id() != $user->id) {
    abort(403);
}

Буду очень благодарен за подсказку как сделать правильно - чтобы для админа были открыты все заказы, а для обычного пользователя только его собственные.
  • Вопрос задан
  • 1235 просмотров
Решения вопроса 1
fomvasss
@fomvasss
PHP developer
Я для подобной задачи поступал следующим образом:
создавал scope (можно даже глобальный) который можно подключить в методе boot класса модели. Например:
//...
class Order extends Model
{
    protected static function boot()
    {
        parent::boot();
        static::addGlobalScope('owner', function (Builder $builder) {
                  $user = Auth::user();
                  if (! $user->isAdmin()) {
                        $builder->where('user_id', $user->id);
                  }
        });
    }
}

Теперь при каждом обращении к order-ам, будет проверятся условие является ли юзер админом, если нет то добавится к запросу условие $builder->where('user_id', $user->id) .
Не совсем хорошо использовать такую логику в моделях, но мне было удобно, и задачу решало,+ работает при обновлении, удалении, просмотре одного, просмотре списка и нечего дополнительно писать не надо.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@jazzus
Вам нужно гуглить схему роли-пермишены. Админ-не админ можно определить как
$user = Auth::user();

if ($user->isAdmin) {
    // code...
}else{
    // code...
}
// не админ
if (!$user->isAdmin) {
    // code...
}

В роуте
'/{user}/orders'
Вероятно нужен user_id вместо user
А значит искать юзера, как
$user=User::find($user_id);
Заказы привязываются к юзеру через hasMany отношение и запрашиваются
$orders = $user->orders;
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы