策略授权与Laravel中的功能可以有什么区别?

时间:2019-02-20 21:37:28

标签: php laravel laravel-5 laravel-4 laravel-5.2

我正在使用laravel基本策略系统来保护未授权用户免受更新后的攻击。例如,用户的ID为1,帖子中的表 User_id 也是1。

现在以$this->authorize('update',$post);的方式,我只能传递一个变量$post进行身份验证。在can方法中,我也可以使用$user变量$user->can('update',$post)进行授权。

这是代码:

在PostPolicy.php中:

public function update(User $user, Post $post)
{
    return $user->id === $post->user_id;
}

在AuthServiceProvider.php中:

protected $policies = [
    Post::class => PostPolicy::class
]

以控制器授权方式:

public function update(Request $request, $id)
{
    $post=Post::find(1);
    $user=User::find(1); 
    $this->authorize('update',$post);
    return 'Hello Everything Access For You ';
}

在Controller中使用can方法:

public function update(Request $request, $id)
{
    $post=Post::find(1);
    $user=User::find(1); 
    if($user->can('update',$post)){
        return 'Your are allowed';
    }
    else
    {
        return 'Your are Not allowed'; 
    }
}

这两个功能对吗?有什么区别。我必须使用哪种方法。预先感谢。

2 个答案:

答案 0 :(得分:1)

如果您使用authorize()can()中的任何一个,目的是验证用户是否有权执行某些任务。

但是:

  • authorize()的情况下,如果失败(从策略方法返回false),则authorize方法将引发Illuminate \ Auth \ Access \ AuthorizationException,默认的Laravel异常处理程序会将其转换为403的HTTP响应

  • 对于can(),它就像检查用户是否被授权的一种基本方法,然后您需要自己处理其余的事情。喜欢未经授权的情况。

考虑到上述因素,我想说$this->authorize('update',$post);更易于在控制器中使用。

documentation

中查看有关此内容的更多信息

也可以:

$request->user()->can(),如果您要检查当前请求用户的授权。

更新:

authorize()旨在授权登录的当前用户,其中laravel会将当前用户自动传递给策略。

您可以在任何用户实例上使用can

  • $request->user()->can(),如果您要检查当前请求用户的授权。
  • $user = $user::find($id); $user->can(...)(如果有其他用户)

答案 1 :(得分:1)

$this->authorize()检查是否已授权当前用户$user->can()检查$user中的用户是否被授权。两者都依赖于相同的基本政策来做出决定。

两者之间的主要区别在于,$this->authorize()会在当前用户未获得授权的情况下引发异常(因为它打算在控制器中使用),而$user->can()只会返回{{1} } / true

如果您希望控制器的行为就像是对与当前用户不同的 用户执行false,则可以执行以下操作:

$this->authorize()

也就是说,这是您要做的- 很少-通常,根据当前用户的权限来确定当前用户是否可以执行某些操作没有多大意义。