Skip to main content

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.
Richtlijnen voor de keuze

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 met Gate::define() in de boot-methode van App\Providers\AppServiceProvider.
De closure van een gate ontvangt altijd de momenteel geauthenticeerde gebruiker als eerste argument. Vanaf het tweede argument kun je extra informatie doorgeven, zoals het betreffende model.

Rechten controleren met een gate

Om in een controller rechten te controleren met een gate gebruik je Gate::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 je Gate::authorize(). Zo hoef je geen abort(403) te schrijven.
Gate::authorize() gooit een Illuminate\Auth\Access\AuthorizationException als de gebruiker geen rechten heeft. Laravel zet die automatisch om in een 403 HTTP-response.

Beheerdersbypass (de before-methode)

Wil je beheerders alle rechten geven, gebruik dan Gate::before().
Geeft de closure van 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 het Post-model is een policy geschikter dan een gate.

Autorisatieflow met policies

Een policy genereren

Met het Artisan-commando make:policy genereer je een policy-klasse.
Om een sjabloon te genereren met alle CRUD-methoden voor een model gebruik je de optie --model.
Er wordt een bestand 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
Volg je deze naamgevingsconventie, dan hoef je de policy niet te registreren.
Als je de naamgevingsconventie niet volgt of handmatig wilt registreren, gebruik je Gate::policy() in de boot-methode van de AppServiceProvider.
In Laravel 13 kun je een policy ook declaratief registreren door het #[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 een before-methode definiëren om beheerders alle rechten te geven.
De before-methode wordt alleen aangeroepen als de policy-klasse een methode heeft die overeenkomt met de actie. Bestaat de update-methode bijvoorbeeld niet, dan wordt before ook niet aangeroepen.

Uitvoervolgorde van de before-callback

Policies gebruiken in controllers

De authorize()-methode

Controllers van Laravel hebben een authorize()-helpermethode (gebruik je de basiscontroller niet, dan gebruik je Gate::authorize()).

RESTful-policies in één keer registreren met authorizeResource()

Roep je authorizeResource() aan in de constructor, dan worden de policy-methoden automatisch gekoppeld aan de bijbehorende acties van de controller.
De koppeling tussen controlleracties en policy-methoden:
Met authorizeResource() hoef je niet in elke actie afzonderlijk authorize() te schrijven. Vooral in combinatie met RESTful resource controllers is dit handig.

Autorisatie via middleware

Voor autorisatiechecks op routeniveau gebruik je de can-middleware.
Een beknoptere notatie met de 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

  • 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, Order en Comment een policy-klasse.
Laatst gewijzigd op 6 september 2026