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);
更容易在控制器中使用。
中查看更多关于相同内容的信息
你也可以这样做:
$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;
}
就是说,这 很少 您想做的事情 - 确定当前用户是否可以根据其他用户的操作做某事(通常)没有多大意义权限。
我正在使用 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);
更容易在控制器中使用。
你也可以这样做:
$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;
}
就是说,这 很少 您想做的事情 - 确定当前用户是否可以根据其他用户的操作做某事(通常)没有多大意义权限。