阻止用户从另一个用户路由laravel 5.6
我正在构建一个用户可以上传图片的应用程序。在用户点击他上传的图像后,laravel将他重定向到route/images/{image_id},在那里用户可以获得他的图像的详细信息,如果他想的话,还可以删除图像。现在的问题是,当我用另一个属于另一个用户图像的图像id在浏览器中手动写入此路由时,我可以用他上传的图像详细信息打开他的视图。如果此图像不属于该用户,我如何阻止该用户访问此路由? web.php中的路由:阻止用户从另一个用户路由laravel 5.6,laravel,laravel-5.6,laravel-middleware,Laravel,Laravel 5.6,Laravel Middleware,我正在构建一个用户可以上传图片的应用程序。在用户点击他上传的图像后,laravel将他重定向到route/images/{image_id},在那里用户可以获得他的图像的详细信息,如果他想的话,还可以删除图像。现在的问题是,当我用另一个属于另一个用户图像的图像id在浏览器中手动写入此路由时,我可以用他上传的图像详细信息打开他的视图。如果此图像不属于该用户,我如何阻止该用户访问此路由? web.php中的路由: Route::get('/images/{image_id}', 'ImageCont
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'));
}
…或者我应该使用某种中间件。感谢使用Laravel策略
为图像创建一个策略,将其命名为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)
经验法则;如果要在代码中多次执行此操作,请使用函数(或者在本例中使用中间件)。因此,对于单个路由,您可以在相关功能中执行,但对于多个路由,最好使用中间件。我认为您将其放入控制器的方法在这种情况下是最好的。您可以将其放在中间件中,但需要进行额外的数据库查询以检索图像的
用户id
。所以,在这种情况下,我认为你的解决方案是最好的方法。