Sök…
Introduktion
Laravel tillhandahåller ett enkelt sätt att auktorisera användaråtgärder för specifika resurser. Med Autorisation kan du selektivt tillåta användare tillgång till vissa resurser medan du nekar åtkomst till andra. Laravel tillhandahåller ett enkelt API för att hantera användartillstånd genom att använda Gates
och Policies
. Gates
tillhandahåller en enkel stängningsbaserad strategi för godkännande med hjälp av AuthServiceProvider
medan Policies
tillåter dig att organisera behörighetslogik runt modeller med klasser.
Använda Gates
Gates
är stängningar som avgör om en användare får utföra en viss åtgärd på en resurs. Gates
definieras vanligtvis i startmetoden för AuthServiceProvider
och AuthServiceProvider
kortfattat för att återspegla vad det gör. Ett exempel på en gate som endast tillåter premiumanvändare att se något innehåll kommer att se ut så här:
Gate::define('view-content', function ($user, $content){
return $user->isSubscribedTo($content->id);
});
En Gate
får alltid en användarinstans som det första argumentet, du behöver inte skicka det när du använder grinden och kan eventuellt få ytterligare argument såsom den vältaliga modellen i fråga.
Auktorisera åtgärder med portar
För att använda exemplet ovan på en bladmall för att dölja innehåll från användaren, skulle du vanligtvis göra något liknande:
@can('view-content', $content)
<! -- content here -->
@endcan
För att helt förhindra navigering till innehållet kan du göra följande i din controller:
if(Gate::allows('view-content', $content)){
/* user can view the content */
}
OR
if(Gate::denies('view-content', $content)){
/* user cannot view content */
}
Obs! Du behöver inte skicka den nuvarande autentiserade användaren till den här metoden, Laravel tar hand om det åt dig.
policies
Politik är klasser som hjälper dig att organisera behörighetslogik runt en modellresurs. Med vårt tidigare exempel kan vi ha en ContentPolicy
som hanterar användaråtkomst till Content
.
För att göra ContentPolicy
ger laravel ett hantverkskommando. Kör helt enkelt
php artisan make:policy ContentPolicy
Detta kommer att göra en tom policyklass och placera i mappen app/Policies
. Om mappen inte finns, skapar Laravel den och placerar klassen inuti.
När den har skapats måste policyer registreras för att hjälpa Laravel veta vilka policyer som ska användas när man godkänner åtgärder på modeller. AuthServiceProvider
, som levereras med alla färska Laravel-installationer, har en policyegenskap som kartlägger dina vältaliga modeller till deras auktoriseringspolicy. Allt du behöver göra lägger till mappningen i matrisen.
protected $policies = [
Content::class => ContentPolicy::class,
];
Skriva policyer
Att skriva Policies
följer ungefär samma mönster som att skriva Gates
. Porten för innehållstillstånd kan skrivas om som en policy som denna:
function view($user, $content)
{
return $user->isSubscribedTo($content->id);
}
Politik kan innehålla fler metoder efter behov för att ta hand om alla tillståndsfall för en modell.
Auktorisera åtgärder med policyer
Via användarmodellen
Laravel User-modellen innehåller två metoder som hjälper till med godkännanden med hjälp av Policies
; can
och can't
. Dessa två kan användas för att avgöra om en användare har godkännande eller inte på en modell respektive.
För att kontrollera om en användare kan visa ett innehåll eller inte, kan du göra följande:
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 styrenheter
Laravel tillhandahåller en hjälpmetod, kallad authorize
som tar namnet på policyn och den tillhörande modellen som argument, och antingen godkänner åtgärden baserad på din auktoriseringslogik eller förnekar handlingen och kastar en AuthorizationException
som Laravel Exception-hanteraren konverterar till en 403 HTTP response
.
pubic function show($id)
{
$content = Content::find($id);
$this->authorize('view', $content);
/* user can view content */
}