Laravel запретить доступ по URL к элементам в базе данных, если он не принадлежит текущему пользователю? - PullRequest
2 голосов
/ 09 ноября 2019

У меня есть таблица базы данных, где мы храним все продукты для всех пользователей. Мы получаем страницу товара по номеру идентификатора продукта примерно так: http://sitename.com/inventory/product/3.

Как я могу запретить доступ к товару по URL, если этот товар не принадлежит текущему пользователю?

Ответы [ 2 ]

0 голосов
/ 12 ноября 2019

Почему бы просто не использовать firstOrFail() в контроллере? Предполагая, что ваша запись о продукте содержит created_by, который ссылается на идентификатор владельца, вы будете искать по id и created_by. Если ничего не найдено, генерируется исключение 404.

public function show(Request $request){

    // Get the user-id
    $user_id = Auth::user()->id;

    // Get the product matching by id and owned by the current user
    $product = Product::where('id', $request->id)->where('created_by',$user_id)->firstOrFail();

    // Do your magic here if product found

}

https://laravel.com/docs/5.8/eloquent#retrieving-single-models

0 голосов
/ 10 ноября 2019

Для этого можно использовать промежуточное ПО Auth . В функции для маршрута вы можете сделать что-то вроде:


public function show($id){

  //get the user visiting the route
  $user = Auth::user();

  //get the product by the id in the url
  $product = Product::where('id','=',$id)->first();

  if($user->id == $product->user_id){

    //return the route like normal

  }else{

    //redirect or return route with different data

  }

}


Просто добавьте use Auth; к вашему контроллеру. И вы захотите защитить свой маршрут , чтобы к нему могли обращаться только аутентифицированные пользователи.

...