#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
работает поведение. Хорошая попытка, хотя!