【问题标题】:What is Difference Between Policy Authorize vs Can Function In Laravel?策略授权与 Laravel 中的功能之间有什么区别?
【发布时间】:2019-07-14 16:33:44
【问题描述】:

我正在使用 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'; 
    }
}

我是否适合这两个功能。有没有区别。我必须使用哪种方法。提前致谢。

【问题讨论】:

  • 根据文档,它们在引擎盖下是相同的。用户模型具有can 函数。控制器有一个authorize。两者都使用基础策略。
  • 如果它们在底层是相同的,那么为什么我不能将 $user 变量传递给$this->authorize('update',$user,$post)
  • 因为authorize 用于授权the current user
  • 但在某些情况下我不想使用当前用户。并使用不同的用户进行检查。尝试了解我喜欢 $t​​his->authorize 功能,但缺少一些齿轮。
  • 这就是can 的用途。如果您在$user 中有任何用户模型,请使用$user->can()

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


【解决方案1】:

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

但是:

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

  • 如果是can(),它只是一个基本的方法来检查用户是否被授权,然后你需要自己处理其余的。如果未经授权该怎么办。

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

documentation中查看更多信息

你也可以这样做:

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

更新:

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

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

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

【讨论】:

  • 我知道,但我可以将 $user 变量传递给 $this->authorize('update',$user,$post) 吗?
  • 用户是laravel在policy中作为第一个参数自动传入的。您不需要手动传递它。 :)
  • @Hashaamzahid 这样做的方法(检查 specific 用户而不是 current 用户是否有权限)将是找到一个用户(类似于$user = App\User::find(123);)然后到$user->can()就可以了。
  • 但情况不同。请尝试理解
  • 啊,我明白你的意思了! :)
【解决方案2】:

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

两者的主要区别在于$this->authorize() 会在当前用户未获得授权时抛出异常(因为它旨在用于控制器中),而$user->can() 只返回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;
}

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-05-03
    • 2017-02-05
    • 1970-01-01
    • 2017-10-12
    • 1970-01-01
    相关资源
    最近更新 更多