Laravel 编辑策略

Posted

技术标签:

【中文标题】Laravel 编辑策略【英文标题】:Laravel policy for editing 【发布时间】:2016-07-30 11:28:49 【问题描述】:

所以我创建了一个策略并在 AuthServicePRvider 中注册它,但它总是返回 false。这是我第一次使用政策,所以我确信我做错了,但以下几个例子对我没有任何帮助。

我使用 id 为 1 的用户登录。我尝试编辑 user_id 为 1 的标签,返回 false,以及尝试编辑 user_id 为 2 的标签时。最后一个按预期工作,但是如果 user_id 和 label->user_id 匹配,我应该显示一个表单。相反,我每次都得到这个:

This action is unauthorized.

有什么想法吗?

AuthServiceProvider:(都试过了,但都不起作用):

protected $policies = [
    'App\Label' => 'App\Policies\LabelPolicy'
];

And this one also did not do the trick:

protected $policies = [
    Label::class => LabelPolicy::class
];

标签控制器@编辑:

public function edit(Label $label)

    // $this->authorize('edit', $label); // This also returns false

    if (auth()->user()->cannot('edit', $label)) 
        dd('NO'); // This is always shown
    

标签政策:

public function edit(Label $label)

    dd('test'); // This is never shown anywhere
    return auth()->user()->id === $label->user_id;

【问题讨论】:

我标签模型与用户模型有关系,使用它而不是直接访问user_idreturn auth()->user()->id === $label->user->id; 我认为这个错误This action is unauthorized.是由于路由问题!如果您有资源控制器。能否请您添加您的路线! 确实,为标签使用资源控制器:Route::resource('labels', 'LabelsController'); 我确实有关系,但返回 auth()->user()->id === $label->user->id;也没有用。所以我可能在某个地方还有其他问题,因为我似乎已经正确设置了所有内容,现在也要感​​谢 Mina 的回答 所以当你访问 'lables/edit/some_id' 你会得到This action is unauthorized. ? 【参考方案1】:

策略实际上需要两个输入,第一个输入始终是 User 类,第二个输入是 Model,默认为 Model 类。所以在你的情况下:

标签政策

public function edit(User $user, Label $label)

    return $user->id === $label->user_id;

LabelsController@edit:

public function edit(Label $label)

    $this->authorize($label);

【讨论】:

忘了说,这是我首先尝试的,策略中的用户 $user 对我也不起作用 如果 Policy 中的 dd() 从未运行,这可能是 AuthServiceProvider 中的映射问题。您确定模型和策略类名称正确吗? 正确包含命名空间,Policy文件中的命名空间也是正确的。 我们开始了。骄傲的我以为我做对了,我什至检查了很多次。当然,在最后一次检查之后,我发现我的命名空间错误。现在工作正常。非常感谢【参考方案2】:

如果你的 $this->authorize 在控制器中总是返回 false,那么仔细检查你的模型和模型策略命名空间是否被导入到 AuthServiceProvider 中,并且你的模型是否已经被导入到你的控制器中。

【讨论】:

以上是关于Laravel 编辑策略的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中模型的多个策略

Laravel 7 Passport:被 CORS 策略阻止

Laravel 中的单会话登录

为啥我的 Laravel 策略总是返回 false?

具有存储库模式的 Laravel 策略

CORS 策略已阻止访问 XMLHttpRequest - Laravel 5.8