Я создаю приложение, в котором пользователь может загружать изображения. После того, как пользователь нажимает на свое загруженное изображение, laravel перенаправляет его на route / images / {image_id}, где пользователь может получить подробную информацию о своем изображении и, возможно, удалить изображение, если он захочет. Теперь проблема в том, что когда я вручную пишу этот маршрут в браузере с другим идентификатором изображения, принадлежащим другому пользовательскому изображению, я могу открыть его представление с его данными загруженного изображения. Как я могу заблокировать пользователя от этого маршрута, если это изображение ему не принадлежит? Маршрут в web.php:
Route::get('/images/{image_id}', 'ImageController@show');
Это метод в ImageController, который перенаправляет пользователя на просмотр изображения:
public function show($id){
$image = Image::findOrFail($id);
return view('user.show_image', compact('image'));
}
Хороший ли вариант попробовать что-то подобное:
public function show($id){
$image = Image::findOrFail($id);
if (Auth::user()->id != $image->user_id)
{
return redirect()->back();
}
return view('user.show_image', compact('image'));
}
..или я должен использовать какое-то промежуточное программное обеспечение. Спасибо
Я думаю, что ваш подход к тому, чтобы поместить его в контроллер, является лучшим в этой ситуации. Вы мог помещаете его в промежуточное ПО, но вам нужно будет сделать дополнительный запрос к базе данных, чтобы получить user_id изображения. Итак, в этом случае я думаю, что ваше решение - лучший подход.






Используйте политики Laravel https://laravel.com/docs/5.6/authorization#writing-policies
создайте политику для изображения, назовите ее ImagePolicy.php и добавьте этот метод:
public function view(User $user, Image $image)
{
return $user->id === $image->user_id
}
в вашем контроллере @show:
$this->authorize('view', $image);
или если вам не нравятся правила:
abort_if ($user->id !== $image->user_id, 404)
Практическое правило; Если вы собираетесь делать это в своем коде несколько раз, используйте функцию (или в данном случае промежуточное ПО). Таким образом, для одного маршрута вы можете сделать это в связанной функции, но для нескольких маршрутов лучше всего использовать промежуточное программное обеспечение.