【发布时间】:2020-05-20 04:06:26
【问题描述】:
我在这里看到了同样的问题:Laravel policies : code change is ignored. Is there any policy cache to clear? 和这里:Laravel Policy bug
我正在编写一个新策略,最简单的策略,通过模式 User 检查登录用户是否是数据库中的同一用户,以便他可以编辑他的个人资料,所以...
我创建策略文件:
> php artisan make:policy UserPolicy
我在AuthServiceProvider.php注册了政策:
...
protected $policies = [
// 'App\Model' => 'App\Policies\ModelPolicy',
User::class => UserPolicy::class,
];
...
在UserPolicy.php 中我创建了edit 函数:
public function edit(User $authUser, User $user) {
return $authUser->id === $user->id;
}
在UserController.php 我有edit:
public function edit($id)
{
//
$user = User::findOrFail($id);
$this->authorize($user);
return view('user.edit', compact('user'));
}
看到有什么不对吗?我也没有,因为它起作用了……第一次。然后我想更改策略,User 模型有一个level 属性,普通用户为 1,管理员为 5,超级用户为 99,依此类推。所以我希望管理员或超级用户能够更改用户数据,所以我将UserPolicy.php的edit函数重写为:
public function edit(User $authUser, User $user) {
return ($authUser->id === $user->id) || ($user->level > 1);
}
当然我在这里犯了一个错误,我应该检查$authUser 和$user。当我在浏览器中检查时,函数返回 false,服务器给了我一个403
This action is unauthorized.,这没关系。现在奇怪的事情。我更正了函数:
public function edit(User $authUser, User $user) {
return ($authUser->id === $user->id) || ($authUser->level > 1);
}
它返回 403...
public function edit(User $authUser, User $user) {
return true;
}
它返回 403...
我从文件中删除函数...它返回 403...
我从 AuthServiceProvider 中删除了注册... Ir 返回 403...
不,我没有使用 Gates 或其他东西,Laravel 应用程序几乎是处女。我过去曾遇到过这个问题,它突然出现,并且与它的出现方式相同。我不知道在哪里寻找,寻找什么......我认为这将是一些我没有掌握的互动,所以我想从这个项目开始时的政策开始。
编辑:::::::::::::::::::::::::::
这更荒谬......如果我在修补程序中使用can() 进行检查,这个 /#&)"# 事情会做它应该做的事情:
> php artisan tinker
>>> $user = App\User::find(1)
>>> $user->can('edit', $user)
true
>>> $user2 = App\User::find(2)
>>> $user->can('edit', $user2)
false
那么,问题来了????
$this->authorize($user);
编辑 2 ::::::::::::: 已解决 ::::::::::::::::::::::
我发誓这曾经像我在上面发布的那样工作过(至少它曾经在 5 中工作过)。我不得不改变
$this->authorize($user);
为
$this->authorize('edit', $user);
解决方案来自这个article
【问题讨论】:
-
让我们从简单的步骤开始。让我们清除配置
php artisan config:clear和缓存php artisan cache:clear。有更新吗? -
不,仍然给 403。我什至恢复到 git 上的上一个分支,从头开始重新编写,仍然给 403
-
第二次我只是返回“true”
-
尝试将
Log::info()添加到您的策略方法中。只是为了确保至少它被调用了。 -
奇怪的是,正如我所说,它第一次按预期工作,所以我猜它被调用了,但下一次,我什至删除了方法,注册表,仍然给我 false (403 ),直到我完全删除 UserPolicy.php 程序才崩溃并告诉我文件丢失了