【问题标题】:Block user from another user route laravel 5.6从另一个用户路由 laravel 5.6 阻止用户
【发布时间】:2018-11-16 12:12:13
【问题描述】:

我正在构建用户可以上传图像的应用程序。在用户点击他上传的图片后,laravel 将他重定向到路由 /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'));
}

..或者我应该使用某种中间件。谢谢

【问题讨论】:

  • 经验法则;如果您最终要在代码中多次执行此操作,请使用函数(或在本例中为中间件)。所以对于单条路由,可以在关联函数中做,但是在多条路由上,最好使用中间件。
  • 我认为您将其放入控制器的方法在这种情况下是最好的。您可以将它放在中间件中,但您需要进行额外的数据库查询来检索图像的user_id。所以,在这种情况下,我认为你的解决方案是最好的方法。

标签: laravel laravel-5.6 laravel-middleware


【解决方案1】:

使用 Laravel 策略 https://laravel.com/docs/5.6/authorization#writing-policies

为 Image 创建一个策略,将其命名为 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-01-08
    • 1970-01-01
    • 1970-01-01
    • 2020-05-08
    • 2022-07-12
    • 1970-01-01
    • 2017-03-30
    • 1970-01-01
    相关资源
    最近更新 更多