Annikangl
@Annikangl
Backend developer (PHP)

Как ограничить доступ пользователя к записи?

Я новичок в Laravel, естьследующая задача: При создании записи в блоге, администратор может выбирать круг пользователей, которые могут подробно просматривать данную запись (попадать на внутреннюю страницу), остальные пользователи, после авторизации, могут видеть все записи, но открывать запись, к которой у них нет доступа - нельзя.

Я создал связующую таблицу user_records

=====================
  user_records_id
  record_id
  user_id


У меня получилось сделать выборку из связующей таблицы, но тогда каждый пользователь видит только доступные ему записи, а необходимо, чтобы он мог видеть все, но открывать только те, на которые у него есть права. Помогите пожалуйста, сижу уже битый час, никак решение не приходит...
  • Вопрос задан
  • 222 просмотра
Решения вопроса 1
PeterLS
@PeterLS
Программист
1) В модели Record создай метод-отношение recordsForShowing.
2) В контроллере RecordController в методе index() выводи все записи.
3) В контроллере RecordController в методе show() добавь проверку:
public function show(App\Models\Record $record) {
    // если пользователь не авторизован или не существует в таблице user_records то выдаем ошибку "недостаточно прав"
    abort_if(!auth('web')->check() || $record->recordsForShowing()->where('user_id', auth('web')->id())->count() < 1, 403);
        
    // дальше обычным образом показываешь запись
    return view('template_name', compact('record'));
}


Тогда список записей смогут увидеть все пользователи, но вот посмотреть полную запись только выбранные пользователи.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Fragster
@Fragster
помогло? отметь решением!
Ответ написан
Комментировать
Stalker_RED
@Stalker_RED
видеть все, но открывать только те

если у вас "видеть" и "открывать" это разные экшены или разные методы в модели, то вы в одной не добавляйте проверку прав, а во второй добавьте.
Ответ написан
Ваш ответ на вопрос

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

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