Policy Authorize 与 Can Function In Laravel 之间有什么区别?

What is Difference Between Policy Authorize vs Can Function In Laravel?

我正在使用 laravel 基本策略系统来保护未经授权的用户免受更新 post。例如,用户的 ID 为 1,In posts Table 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 ';
}

在控制器中使用 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'; 
    }
}

我适合这两个功能吗?有什么不同吗?我必须使用哪种方法。提前致谢。

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

但是:

  • authorize() 的情况下,如果它失败(returns 来自策略方法的 false),授权方法将抛出一个 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(...) 如果是其他用户

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

两者之间的主要区别是 $this->authorize() 如果当前用户未被授权(因为它打算在控制器中使用)则抛出异常,而 $user->can() 只是 returns true/false.

如果您希望控制器表现得好像它正在为 不同 用户而不是当前用户做 $this->authorize(),您可以这样做:

// where "123" is the user you want to check against
$user = App\User::find(123);

if(!$user->can('update', $post) {
    throw new \Illuminate\Auth\Access\AuthorizationException;
}

就是说,这 很少 您想做的事情 - 确定当前用户是否可以根据其他用户的操作做某事(通常)没有多大意义权限。