【问题标题】:Laravel 5 Authorize User to see certain ButtonsLaravel 5 授权用户查看某些按钮
【发布时间】:2015-03-11 11:37:56
【问题描述】:

我刚开始学习 Laravel 5,遇到了一个我无法解决的问题: 如何判断某个用户只能看到某些东西。

例如,如果我查看不是我自己的个人资料,“编辑个人资料”按钮应该不可见。但是如果我查看我自己的个人资料,这个按钮应该是可见的。

我已经得到的是授权某些请求。例如授权用户实际更新个人资料:

public function updateProfile(Profile $profile, UpdateProfile $request){
      //update the given profile
}

所以这里的 UpdateProfile 是一个请求类,它有一个 authorize() 和一个 rule() 方法,在 authorize() 方法中我检查登录的用户是否正在更新他自己的个人资料。

所以我想也许我可以单独使用 authorize() 方法,但我不确定如何。

现在我当然可以随时检查:

if($user -> userID == Auth::user() -> userID)

但是如果我需要检查更复杂的东西怎么办,例如当我写一篇文章并想为我想检查的那个帖子显示一个删除按钮时: 是用户管理员,如果不是该帖子的用户作者,如果其中任何一个为真,则显示删除按钮。

所以我的问题是,在 laravel 5 中我会在哪里检查这样的东西?

【问题讨论】:

    标签: php laravel-5 authorize


    【解决方案1】:

    您可以在 Post 类上编写 userCanEdit 方法。像这样的:

    function userCanEdit(User $user)
    {
        return $user->isAdmin() || $this->user_id == $user->id;
    }
    

    然后在你的视图中调用它:

    @if ($post->userCanEdit(Auth::user()))
        <a href="{{ url("edit/{$post->getId()}") }}">Edit</a>
    @endif
    

    这样做的好处是您可以保持视图整洁并将业务逻辑集中在一个可重用的方法中。如果可以编辑帖子的用户的定义发生变化,那是您唯一需要担心的地方。

    【讨论】:

    • “Post”类是指 Post Model 类吧?
    • 是的。 (答案太短)
    【解决方案2】:

    所以我的问题是,在 laravel 5 中我会在哪里检查这样的东西?

    在您看来。例如,假设您正在加载这样的博客内容:

    // controller
    
    public function showPost(Post $post){
        return view('views.post', ['post' => $post]);
    }
    

    在视图中,我们希望只有作者对其进行更改。

    // post view
    
    <h2>{{ $post->getTitle() }}</h2>
    
    @if ($post->getAuthor()->getId() === Auth::user()->getId())
        <a href="{{ url("edit/{$post->getId()}") }}">Edit</a>
    @endif
    

    如您在上面看到的,如果作者与经过身份验证的用户是同一用户,那么她/他可以看到该帖子的编辑链接。

    【讨论】:

    • 您必须确定,该用户也被允许发送一个帖子请求?或者丢失的 _token 会保护它吗?
    • _token 只是验证请求是否由您(作为浏览器用户)发出,而不是像机器人或软件这样的编程/外部资源。服务器验证就像 OP 做一个 Request 类一样完成
    猜你喜欢
    • 2015-07-29
    • 2011-02-11
    • 2020-10-09
    • 1970-01-01
    • 2018-05-31
    • 2019-04-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多