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 */
}


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow