【问题标题】:Laravel policy always returns 403 despite user role being correct尽管用户角色正确,Laravel 策略总是返回 403
【发布时间】:2021-12-04 09:36:52
【问题描述】:

我正在开发一个有客户和管理员的 Laravel 8 项目。如果管理员的角色是superadmin,则允许管理员查看我的ManagementController 中的数据。我的users 表上有一个role 列作为enum 值,并且已经注册了我的策略,但无论角色如何,它总是返回403 和我的消息,我做错了什么。

我的政策是:

<?php

namespace App\Policies;

use App\Models\User;
use Illuminate\Auth\Access\HandlesAuthorization;

class ManagementPolicy
{
    use HandlesAuthorization;

    /**
     * Determine whether the user can view the model.
     *
     * @param  \App\User  $user
     * @return mixed
     */
    public function view(User $user)
    {
        return $user->role == 'superadmin';
    }
}

注册我的保单:

protected $policies = [
    User::class => ManagementPolicy::class
];

然后在我的index 函数中,我确定用户是否无法查看资源,然后返回:

if (Auth::user()->cant('view', User::class)) {
    return response()->json([
        'success' => false,
        'message' => 'not allowed',
        'role' => Auth::user()->role
    ], 403);
}

【问题讨论】:

  • 在策略检查中尝试使用 cannot 而不是 cant
  • 似乎只适用于 Managemnt::class 作为秒 arg,我的控制器列在 app/Http/Controllers/Management/DashboardController 下,所以不确定为什么它与不存在的类一起使用?

标签: php laravel authentication


【解决方案1】:

听起来好像是在使用自动发现策略,而不是使用您定义的策略。确保您在AppServiceProvider 中调用registerPolicies

/**
 * Register any authentication / authorization services.
 *
 * @return void
 */
public function boot()
{
    $this->registerPolicies();
}

有关更多信息,请参阅有关自动发现的 laravel 文档:https://laravel.com/docs/8.x/authorization#policy-auto-discovery

【讨论】:

  • 谢谢@erin,我的boot 函数中的$this-&gt;registerPolicies() 已经在我的AuthServiceProvider 中了? ://
  • 嗯...protected $policies 应该优先于自动发现。
  • 是的,我也是这么想的,所以如果我有一个名为 ManagementPolicy 的策略,我这样做了,Laravel 正在剥离 Policy 部分,这就是为什么 Management::class 可以正常工作的原因?
  • 将策略重命名为UserPolicy 是否有效?你有一个名为Management的模型吗?
  • 我没有一个名为 Management 的模型,例如我只想禁止用户在用户角色不相等时查看控制器操作,我认为这是一个策略这是前进的方向吗?如果他们的用户角色不等于我想要的,我只想阻止某人做某事
猜你喜欢
  • 2021-03-23
  • 2021-08-20
  • 2020-12-08
  • 2021-04-05
  • 2018-10-24
  • 2020-09-02
  • 2019-01-08
  • 2010-11-29
  • 2021-05-15
相关资源
最近更新 更多