Gate a middleware
Pri zapnutom register_gate_check (predvolene) sa oprávnenia vyhodnocujú cez Gate v Laraveli, takže natívny middleware can: funguje hneď:
Route::get('/users', UsersController::class)->middleware('can:auth.users.view');
$user->can('auth.users.view'); // true when granted directly or via a role
Gate::forUser($user)->allows('auth.users.view');Ako hook rozhoduje
Balík zaregistruje jediný hook Gate::before. Odpovedá iba vtedy, keď platí všetko nasledujúce — inak vráti null a vaše vlastné gates a policies prebehnú bez zásahu:
- Kontrola nemá argumenty — žiadny model ani ďalšie parametre.
- Model používateľa má metódu hasPermissionTo(), teda používa HasRoles.
- Ability je názov zaregistrovaného oprávnenia.
Ak používateľ oprávnenie drží — priamo alebo cez rolu — hook vráti true. Nikdy nevráti false: používateľ bez oprávnenia prejde na vaše gates, a ak žiadne nie sú, Laravel prístup zamietne, takže middleware can: odpovie kódom 403.
Posledné slovo majú policies
Kontrola oprávnení nikdy neprebije policy modelu. Hneď ako kontrola nesie model alebo akýkoľvek argument — $user->can('update', $post) či middleware can:update,post — hook prenechá rozhodnutie vašej gate alebo policy. Oprávnenie s názvom update autorizuje $user->can('update'), no o $user->can('update', $post) stále rozhoduje PostPolicy::update():
Permissions::permission('update');
Permissions::for($user)->givePermissionTo('update');
$user->can('update'); // true — argument-less, answered by the permission
$user->can('update', $post); // PostPolicy::update() decides — ownership, tenancy, …final class PostPolicy
{
public function update(User $user, Post $post): bool
{
return $post->owner_id === $user->getKey();
}
}Hrubozrnné oprávnenia a policies viazané na model tak fungujú vedľa seba a ani jedno potichu nepohltí druhé.
Vypnutie hooku
Nastavte register_gate_check na false, ak chcete hook úplne vynechať a oprávnenia vyhodnocovať sami:
// config/permissions.php
'register_gate_check' => false,
// then check explicitly where you need it
abort_unless($request->user()->hasPermissionTo('auth.users.view'), 403);Prejavte lásku k open source
Tento balík je zadarmo pod licenciou MIT. Ak vám šetrí čas, jednorazový príspevok alebo členstvo na Patreone nám pomôže ho ďalej udržiavať, testovať a dokumentovať.
Ďalšie spôsoby podpory vrátane kryptomienOdoslaním daru súhlasíte s našimi podmienkami prijímania darov.
Chcete to zabudovať do svojho produktu?
Naše balíky integrujeme do zákazkových Laravel a AI riešení. Napíšte nám, na čom pracujete, a ozveme sa do 48 hodín.