Через перевірку, що виконується перед усіма іншими.
Для всього застосунку - Gate::before():
// AppServiceProvider::boot()
Gate::before(function (User $user, string $ability) {
return $user->isSuperAdmin() ? true : null;
});
Для однієї політики - метод before():
public function before(User $user, string $ability): ?bool
{
return $user->isSuperAdmin() ? true : null;
}
Головне - повертати null, а не false, для всіх, хто не суперадмін. null означає «не вирішую, перевіряй далі», а false заборонив би дію всім іншим, не дійшовши до політики.
Gate::after() - навпаки, спрацьовує після перевірок і впливає на результат, лише якщо гейт чи політика повернули null. Зручно для правила за замовчуванням.
Обережно з «усім можна»:
- суперадмін через
beforeобійде навіть правила, які мали б діяти для всіх, - наприклад, «не можна видалити оплачене замовлення»; такі бізнес-обмеження краще перевіряти окремо від прав; - дії суперадміна варто журналювати;
- для гнучкої моделі ролей і прав зазвичай беруть пакет на кшталт spatie/laravel-permission, а
beforeлишають для однієї надролі.