Zoeken…
Invoering
Laravel biedt een eenvoudige manier om gebruikersacties voor specifieke bronnen te autoriseren. Met Autorisatie kunt u gebruikers selectief toegang geven tot bepaalde bronnen en toegang tot anderen weigeren. Laravel biedt een eenvoudige API voor het beheren van gebruikersautorisaties met behulp van Gates
and Policies
. Gates
bieden een eenvoudige, op afsluiting gebaseerde benadering van autorisatie met behulp van AuthServiceProvider
terwijl met Policies
u autorisatielogica rondom modellen met behulp van klassen kunt organiseren.
Gates gebruiken
Gates
zijn sluitingen die bepalen of een gebruiker een bepaalde actie op een resource mag uitvoeren. Gates
worden meestal gedefinieerd in de opstartmethode van AuthServiceProvider
en beknopt genoemd om aan te geven wat het doet. Een voorbeeld van een poort waarmee alleen premium-gebruikers bepaalde inhoud kunnen bekijken, ziet er zo uit:
Gate::define('view-content', function ($user, $content){
return $user->isSubscribedTo($content->id);
});
Een Gate
ontvangt altijd een gebruikersinstantie als het eerste argument, u hoeft dit niet door te geven wanneer u de gate gebruikt, en kan optioneel aanvullende argumenten ontvangen, zoals het betreffende welsprekende model.
Acties autoriseren met Gates
Als u het bovenstaande voorbeeld op een bladsjabloon wilt gebruiken om inhoud voor de gebruiker te verbergen, doet u meestal zoiets:
@can('view-content', $content)
<! -- content here -->
@endcan
Om navigatie naar de inhoud volledig te voorkomen, kunt u het volgende doen in uw controller:
if(Gate::allows('view-content', $content)){
/* user can view the content */
}
OR
if(Gate::denies('view-content', $content)){
/* user cannot view content */
}
Opmerking: u bent niet verplicht om de momenteel geverifieerde gebruiker aan deze methode door te geven, Laravel regelt dat voor u.
beleid
Beleid zijn klassen die u helpen autorisatielogica rond een modelresource te organiseren. In ons vorige voorbeeld hebben we misschien een ContentPolicy
dat gebruikerstoegang tot het Content
model beheert.
Om ContentPolicy
te maken, biedt laravel een ambachtelijk commando. Ren gewoon
php artisan make:policy ContentPolicy
Hiermee wordt een lege beleidsklasse gemaakt en in de map app/Policies
. Als de map niet bestaat, maakt Laravel deze en plaatst de klas erin.
Eenmaal gemaakt, moet beleid worden geregistreerd om Laravel te helpen weten welk beleid te gebruiken bij het autoriseren van acties op modellen. De AuthServiceProvider
Laravel, die wordt geleverd met alle nieuwe Laravel-installaties, heeft een AuthServiceProvider
die uw welsprekende modellen AuthServiceProvider
aan hun autorisatiebeleid. Het enige dat u hoeft te doen, is de toewijzing aan de array toevoegen.
protected $policies = [
Content::class => ContentPolicy::class,
];
Schrijfbeleid
Het schrijven van Policies
volgt vrijwel hetzelfde patroon als het schrijven van Gates
. De content-toegangspoort kan als een beleid als volgt worden herschreven:
function view($user, $content)
{
return $user->isSubscribedTo($content->id);
}
Beleid kan meer methoden bevatten als nodig is om alle autorisatiezaken voor een model af te handelen.
Acties autoriseren met beleid
Via het gebruikersmodel
Het Laravel-gebruikersmodel bevat twee methoden die helpen bij autorisaties met behulp van Policies
; can
en can't
. Deze twee kunnen worden gebruikt om te bepalen of een gebruiker al dan niet autorisatie heeft voor een model.
Om te controleren of een gebruiker inhoud kan bekijken of niet, kunt u het volgende doen:
if($user->can('view', $content)){
/* user can view content */
}
OR
if($user->cant('view', $content)){
/* user cannot view content */
}
Via Middleware
Route::get('/contents/{id}, function(Content $content){
/* user can view content */
})->middleware('can:view,content');
Via controllers
Laravel biedt een helper-methode, authorize
genaamd die de naam van het beleid en het bijbehorende model als argumenten gebruikt, en autoriseert de actie op basis van uw autorisatielogica of weigert de actie en gooit een AuthorizationException
die de Laravel Exception-handler converteert naar een 403 HTTP response
.
pubic function show($id)
{
$content = Content::find($id);
$this->authorize('view', $content);
/* user can view content */
}