Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
阻止用户从另一个用户路由laravel 5.6_Laravel_Laravel 5.6_Laravel Middleware - Fatal编程技术网

阻止用户从另一个用户路由laravel 5.6

阻止用户从另一个用户路由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

我正在构建一个用户可以上传图片的应用程序。在用户点击他上传的图像后,laravel将他重定向到route/images/{image_id},在那里用户可以获得他的图像的详细信息,如果他想的话,还可以删除图像。现在的问题是,当我用另一个属于另一个用户图像的图像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'));
}
…或者我应该使用某种中间件。感谢使用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
。所以,在这种情况下,我认为你的解决方案是最好的方法。