【问题标题】:Laravel - Allow only the owner of the note to view it and edit it: Middleware or FormRequests?Laravel - 只允许笔记的所有者查看和编辑它:中间件还是 FormRequests?
【发布时间】:2016-06-06 21:33:33
【问题描述】:

想象一个个人笔记应用。用户可以添加、查看和编辑自己的笔记,但不能添加、查看和编辑属于其他用户的笔记。

通过这种方式访问​​笔记:app.dev/notes/{id}

所以很自然,如果我拥有一个 ID 为 140 的便笺,但在 URL 中将 id 更改为 160,我将能够查看该便笺。

我想防止这种情况发生。我想过为此使用中间件,但我读到有人说我们不应该为此使用中间件,因为它不灵活,我应该改用 FormRequests。

问题是,我不明白在这种情况下如何使用 FormRequests。我使用 FormRequests 来防止用户编辑不属于他们的笔记。如果我拥有 ID 为 140 的便笺,并尝试编辑/发布 ID 为 160 的便笺,我的表单请求不会让我这样做。

但是这个 FormRequest 实际上并没有阻止我查看 ID 为 160 的便笺。

有人可以指点我这样做的正确方法吗?

谢谢

【问题讨论】:

    标签: php laravel laravel-5 laravel-middleware


    【解决方案1】:

    您可以使用策略。更简洁的授权方式。

    Authorization Policy : Laravel

    创建并注册您的策略后,您可以执行类似的操作

    public function access(User $user, Note $note) 
    { 
        return $user->id === $note->user_id; 
    } 
    

    然后在你的方法中

    if (!$user->cannot('access', $note)) 
    { 
        // throw error or redirect somewhere else 
    }
    

    【讨论】:

    • 请在此处添加最相关的部分。
    • 创建并注册您的策略后,您可以执行类似public function access(User $user, Note $note) { return $user->id === $note->user_id; } 的操作,然后在您的方法中使用if (!$user->cannot('access', $note)) { // throw error or redirect somewhere else }
    • 请作为答案的一部分。
    • 请查看上面的评论。 @CSchulz
    【解决方案2】:

    我会为此使用中间件。让中间件获取当前用户,检查他们是否有权访问指定的笔记,如果他们无权访问则中止。

    如果您使用存储库模式,请确保使用中间件的构造函数来传递任何所需的存储库/依赖项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-23
      • 1970-01-01
      • 2014-12-14
      • 1970-01-01
      • 1970-01-01
      • 2016-10-31
      • 2021-05-19
      • 1970-01-01
      相关资源
      最近更新 更多