Политика не вызывается при использовании Gate ‘s before()

#php #laravel

#php #laravel

Вопрос:

Я создал политику с именем ProjectPolicy с одной функцией:

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

Я зарегистрировал свою политику в своем AuthServiceProvider как:

 protected $policies = [
    'AppProject' => 'AppPoliciesProjectPolicy'
]
  

Также в AuthServiceProvider у меня есть это:

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

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

Предполагается, что политика не применяется, если пользователь является администратором. Но когда я делаю это, это полностью лишает доступа пользователей, не являющихся администраторами. Почему?

Ответ №1:

Чтобы исправить это, 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 возвращает ненулевой результат, этот результат будет считаться результатом проверки.

Комментарии:

1. Во-первых, я был поражен тем, как быстро вы отвечаете в 55 secs

2. @ZainFarooq, потому что OP был готов с вопросом и ответом на него;).

3. @RahulMeshram Я… Это то, о чем я говорю 🙂

4. Этот ответ на самом деле может помочь людям понять, как asynchronous работает поведение. Хорошая попытка, хотя!