使用Gate的before()时未调用策略

时间:2019-04-23 06:29:41

标签: php laravel

我创建了一个名为ProjectPolicy的策略,该策略具有一个功能:

public function update(User $user, Project $project)
{
    return $project->owner_id == $user->id;
}

我在AuthServiceProvider中将保单注册为:

protected $policies = [
    'App\Project' => 'App\Policies\ProjectPolicy'
]

AuthServiceProvider中,我也这样:

public function boot(Gate $gate)
{
    $this->registerPolicies();

    $gate->before(function ($user) {
        return $user->isAdmin();
    });
}

如果用户是admin,则应该不应用该策略。但是,当我这样做时,它完全剥夺了非管理员用户的访问权限。为什么?

1 个答案:

答案 0 :(得分:0)

要解决此问题,boot方法应更新为:

public function boot(Gate $gate)
{
    $this->registerPolicies();

    $gate->before(function ($user) {
        return $user->isAdmin() ? true : null;
    });
}

来自https://laravel.com/docs/5.8/authorization#intercepting-gate-checks

  

如果before回调返回非空结果,则结果为   考虑了检查的结果。