Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 02.06.2019 20:56:51

Защита роутов через middleware или что-то другое

Имею следующую схему данных
DS7uf.png
-Users. Таблица с данными пользователей
-Journals. Таблица со списком журналов.
-Entries. Таблица со списком записей в журналах.
-journal_user. Журнал могут вести разные пользователи. Таблица описывает права. Только те пользователи, которым указаны в этой таблице для определённого журнала, могут его вести.

Связь от Users к Entries. Каждая запись в журнале принадлежит определённому пользователю.
Есть Journal, который могут заполнять Entries определённые Users. Каждая Entry принадлежит определённому User. И только пользователь, который сделал эту Entry может её редактировать. Имеется необходимость в следующих ограничениях:

Для определённого Journal только определённые Users могут оставлять Entries. Остальные Users не должны иметь никаких прав на работу с Journals и Entries.

Только тот User, который оставил Entry (при условии, что он всё ещё имеет права на работу с журналом, т.е. присутствует в таблице journal_user) может редактировать её. Остальные доверенные пользователи (из таблицы journal_user для текущего Journal) могут только читать.
Я не знаю, как подступиться к описанным выше требованиям к ограничениям. Самое удобное - сделать ограничение подобное на стороне middleware, который бы использовался в качестве middleware для группы роутов в web.php. И если с пользователем понятно (я могу получить его данные через Auth::user()), то как быть с Journal?

Route::get('journals/{journal}', 'JournalController@show')->name('journals.show');

Нужно проверить, что пользователь может открыть этот журнал. Значит на стороне middleware нужно как-то получить переданный параметр роута {journal}. Как это можно сделать?

Насчёт возможности редактирования только своей записи я вроде бы понимаю - реализовать можно через Request и валидацию (есть там метод auth). Но как быть с выше описанным? Это можно сделать как-то иначе? Да, я могу в каждом методе контроллеров проверять, но это же не правильно, да?

Не в сети

#2 02.06.2019 23:15:11

Re: Защита роутов через middleware или что-то другое

Я не знаю как у вас реализован роут, но в middleware можно достать все что нужно через $request (Illuminate\Http\Request)

public function handle(Request $request, Closure $next) {
$journal = $request->route('journal');
}

Изменено lodar (02.06.2019 23:17:47)

Не в сети

Подвал раздела