【问题标题】:Laravel Policies: Is there a bug? a cache? how to solve?Laravel 政策:有错误吗?缓存?怎么解决?
【发布时间】: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.phpedit函数重写为:

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 程序才崩溃并告诉我文件丢失了

标签: php laravel


【解决方案1】:

我发誓这曾经像我在上面发布的那样工作过(至少它曾经在 5 中工作过)。我不得不改变

$this->authorize($user);

$this->authorize('edit', $user);

解决方案来自这个article

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 2021-03-20
    • 2017-02-02
    • 2016-09-18
    • 2011-09-09
    • 1970-01-01
    相关资源
    最近更新 更多