Het verschil tussen authenticatie en autorisatie
Authenticatie controleert “wie” een gebruiker is. Het inlogproces is daar het bekendste voorbeeld van. Autorisatie bepaalt “wat” die gebruiker mag doen. Denk aan controles zoals: je mag alleen je eigen posts bewerken, of alleen beheerders mogen instellingen wijzigen. Heb je met authenticatie een inlogfunctie geïmplementeerd, dan is autorisatie de volgende stap.De autorisatiefunctionaliteit van Laravel biedt twee benaderingen: gates en policies. Welke je gebruikt hangt af van de use case.
Gates
Gates zijn eenvoudige, closure-gebaseerde autorisatiechecks. Ze zijn geschikt voor rechtencontroles die niet aan een specifiek model gekoppeld zijn.Autorisatieflow met gates
Een gate definiëren
Gates definieer je metGate::define() in de boot-methode van App\Providers\AppServiceProvider.
Rechten controleren met een gate
Om in een controller rechten te controleren met een gate gebruik jeGate::allows() of Gate::denies().
Een exceptie gooien met Gate::authorize()
Om automatisch een 403-response terug te geven wanneer de gebruiker geen rechten heeft, gebruik jeGate::authorize(). Zo hoef je geen abort(403) te schrijven.
Beheerdersbypass (de before-methode)
Wil je beheerders alle rechten geven, gebruik danGate::before().
before een andere waarde dan null terug, dan wordt dat resultaat het eindoordeel van de rechtencheck. Geeft de closure null of niets terug, dan gaat de normale gate-check verder.
@can / @cannot in Blade-templates
Voor gate-checks in templates zijn de directives@can en @cannot handig.
Policies
Een policy bundelt de autorisatielogica voor een specifiek model in een klasse. Voor het rechtenbeheer van aanmaken, bekijken, bewerken en verwijderen op hetPost-model is een policy geschikter dan een gate.
Autorisatieflow met policies
Een policy genereren
Met het Artisan-commandomake:policy genereer je een policy-klasse.
--model.
app/Policies/PostPolicy.php gegenereerd.
Automatische detectie van modellen en policies
Laravel detecteert policies standaard automatisch op basis van naamgevingsconventies.- Model:
app/Models/Post.php - Policy:
app/Policies/PostPolicy.php
Als je de naamgevingsconventie niet volgt of handmatig wilt registreren, gebruik je In Laravel 13 kun je een policy ook declaratief registreren door het
Gate::policy() in de boot-methode van de AppServiceProvider.#[UsePolicy]-attribuut aan het model toe te voegen.Policy-methoden implementeren
Een policy die je met de optie--model genereert, bevat methoden voor de standaard CRUD-acties.
Beheerdersbypass (de before-methode)
Ook in een policy kun je eenbefore-methode definiëren om beheerders alle rechten te geven.
Uitvoervolgorde van de before-callback
Policies gebruiken in controllers
De authorize()-methode
Controllers van Laravel hebben eenauthorize()-helpermethode (gebruik je de basiscontroller niet, dan gebruik je Gate::authorize()).
- User::can() / cannot()
RESTful-policies in één keer registreren met authorizeResource()
Roep jeauthorizeResource() aan in de constructor, dan worden de policy-methoden automatisch gekoppeld aan de bijbehorende acties van de controller.
Autorisatie via middleware
Voor autorisatiechecks op routeniveau gebruik je decan-middleware.
can-methode:
Policies gebruiken in Blade-templates
Zodra een policy is geregistreerd, wordt die ook automatisch gebruikt door de Blade-directives@can / @cannot.
Praktijkvoorbeeld: rechtenbeheer voor blogposts
Een voorbeeld waarin we in een blogapp de rechten “alleen de auteur mag zijn eigen artikelen bewerken en verwijderen” implementeren.1
Genereer een policy
2
Implementeer de policy-methoden
3
Voeg authorizeResource() toe aan de controller
4
Voeg rechtenchecks toe aan het Blade-template
Samenvatting
Wanneer gebruik je gates en wanneer policies?
Wanneer gebruik je gates en wanneer policies?
- Gates: eenvoudige rechtenchecks die niet aan een specifiek model gekoppeld zijn. Bijvoorbeeld toegang tot een beheerdersdashboard of rechten om globale instellingen te wijzigen.
- Policies: rechtenbeheer voor CRUD-bewerkingen op modellen. Maak per resource zoals
Post,OrderenCommenteen policy-klasse.
Overzicht van veelgebruikte API's
Overzicht van veelgebruikte API's
Veelgebruikte Artisan-commando's
Veelgebruikte Artisan-commando's