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_id
:return 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 编辑策略的主要内容,如果未能解决你的问题,请参考以下文章