Gates and Policies in Laravel

I dag skal vi diskutere autorisasjonssystemet for Laravel web-rammeverket. Laravel-rammen implementerer autorisasjon i form av porter og retningslinjer. Etter en introduksjon til portene og retningslinjene, demonstrerer jeg konseptene ved å implementere et tilpasset eksempel.

Jeg antar at du allerede er klar over det innebygde Laravel-autentiseringssystemet, da det er noe viktig for å forstå konseptet om autorisasjon. Tydeligvis fungerer autorisasjonssystemet i forbindelse med godkjenningssystemet for å identifisere den legitime brukerøkten.

Hvis du ikke er klar over Laravel-autentiseringssystemet, anbefaler jeg at du går gjennom den offisielle dokumentasjonen, som gir deg praktisk innblikk i emnet.

Laravels tilnærming til godkjenning

Ved nå bør du allerede vite at Laravel autorisasjonssystemet kommer i to smaker-porter og retningslinjer. Selv om det kan høres ut som en komplisert affære, vil jeg si det er ganske enkelt å implementere det når du får tak i det!

Gates lar deg definere en autorisasjonsregel ved hjelp av en enkel nedleggelsesbasert tilnærming. Med andre ord, når du vil autorisere en handling som ikke er relatert til en bestemt modell, er porten det perfekte stedet å implementere den logikken.

La oss få en rask titt på hvilken gatebasert autorisasjon som ser ut:

... Gate: define ('update-post', funksjon ($ bruker, $ post) return $ user-> id == $ post-> user_id;); ... 

Ovennevnte utdrag definerer autorisasjonsregelen update-post som du kan ringe fra hvor som helst i søknaden din.

På den annen side bør du bruke retningslinjer når du vil gruppere autorisasjonslogikken til en hvilken som helst modell. For eksempel, la oss si at du har en Post-modell i søknaden din, og du vil autorisere CRUD-handlingene til modellen. I så fall er det retningslinjene du må implementere.

klasse PostPolicy offentlig funksjonvisning (User $ user, Post $ post)  offentlig funksjon opprette (User $ user)  offentlig funksjon oppdatering (User $ bruker, Post $ post)  offentlig funksjon slette (User $ user, Post $ innlegg) 

Som du kan se, er det en ganske enkel policy klasse som definerer autorisasjon for CRUD handlinger av Post modell.

Så det var en introduksjon til porter og politikk i Laravel. Fra neste avsnitt og videre går vi gjennom en praktisk demonstrasjon av hvert element.

Gates

I denne delen ser vi et ekte eksempel for å forstå begrepet porte.

Oftere enn ikke, ender du opp med Laravel-tjenesteleverandøren når du må registrere en komponent eller en tjeneste. Etter denne konvensjonen, la oss gå videre og definere vår tilpassede gate i app / Leverandører / AuthServiceProvider.php som vist i følgende utdrag.

 'App \ Policies \ ModelPolicy',]; / ** * Registrer eventuelle godkjenning / autorisasjonstjenester. * * @return void * / public function boot () $ this-> registerPolicies (); Gate :: define ('update-post', funksjon ($ bruker, $ post) return $ user-> id == $ post-> user_id;); 

I støvel metode, har vi definert vår egendefinerte gate:

Gate :: define ('update-post', funksjon ($ bruker, $ post) return $ user-> id == $ post-> user_id;);

Mens du definerer en gate, tar det et lukke som returnerer enten SANT eller FALSK basert på autorisasjonslogikken som er definert i portdefinisjonen. Bortsett fra lukkefunksjonen, finnes det andre måter du kan definere portene på.

For eksempel kaller den følgende portdefinisjonen kontrolleren handling i stedet for lukkingsfunksjonen.

Gate :: define ('update-post', 'ControllerName @ MethodName');

La oss nå gå videre og legge til en tilpasset rute slik at vi kan gå gjennom en demonstrasjon av hvordan gatebasert autorisasjon fungerer. I rutefilen ruter / web.php, la oss legge til følgende rute.

Route :: get ('service / post / gate', 'PostController @ gate');

La oss lage en tilhørende kontrollerfil app / Http / kontrollere / PostController.php også.

I de fleste tilfeller vil du ende opp med å bruke enten tillater eller benekter metode av Port fasade for å autorisere en bestemt handling. I vårt eksempel ovenfor har vi brukt tillater metode for å kontrollere om den nåværende brukeren er i stand til å utføre update-post handling.

Brukere med skarpe øyne ville ha lagt merke til at vi bare har passert det andre argumentet $ post til lukkingen. Det første argumentet, den nåværende innloggede brukeren, injiseres automatisk av Port fasade.

Så det er slik du skal bruke portene til å godkjenne handlinger i Laravel-søknaden din. Neste avsnitt handler om hvordan du bruker retningslinjer, hvis du ønsker å implementere godkjenning for modellene dine.

politikk

Som vi diskuterte tidligere, når du vil logge gruppert autorisasjonshandlinger for en bestemt modell eller ressurs, er det politikken du leter etter.

I denne delen skal vi opprette en policy for innleggsmodellen som vil bli brukt til å godkjenne alle CRUD-handlingene. Jeg antar at du allerede har implementert Post-modellen i søknaden din; ellers vil noe lignende gjøre.

Laravel håndverker kommandoen er din beste venn når det gjelder å lage stubbed kode. Du kan bruke følgende artisan-kommando for å lage en policy for Post-modellen.

$ php artisan make: policy PostPolicy --model = Post

Som du ser, har vi levert --Modellen = Post argument slik at det skaper alle CRUD-metodene. I fravær av det, vil det opprette en tom policy klasse. Du kan finne den nyopprettede Policy klassen på app / Politikk / PostPolicy.php.

La oss erstatte den med følgende kode.

id> 0;  / ** * Bestem om brukeren kan oppdatere innlegget. * * @param \ App \ Bruker $ bruker * @param \ App \ Post $ post * @return mixed * / offentlig funksjon oppdatering (User $ bruker, Post $ post) return $ user-> id == $ post-> bruker-ID;  / ** * Bestem om brukeren kan slette innlegget. * * @param \ App \ Bruker $ bruker * @param \ App \ Post $ post * @return mixed * / offentlig funksjon slette (Bruker $ bruker, Post $ post) return $ user-> id == $ post-> bruker-ID; 

For å kunne bruke vår Policy klasse må vi registrere det ved hjelp av Laravel-tjenesteleverandøren som vist i følgende utdrag.

 'App \ Policies \ ModelPolicy', Post :: class => PostPolicy :: klasse]; / ** * Registrer eventuelle godkjenning / autorisasjonstjenester. * * @return void * / public function boot () $ this-> registerPolicies (); 

Vi har lagt til kartleggingen av vår policy i $ politikk eiendom. Det forteller Laravel å ringe til den tilsvarende politiske metoden for å godkjenne CRUD-handlingen.

Du må også registrere retningslinjene ved hjelp av registerPolicies metode, som vi har gjort i støvel metode.

Flytter videre, la oss lage et par tilpassede ruter i ruter / web.php filen slik at vi kan teste våre policymetoder der.

Route :: get ('service / post / view', 'PostController @ view'); Rute :: get ('service / post / create', 'PostController @ create'); Rute :: get ('service / post / update', 'PostController @ update'); Rute :: get ('service / post / delete', 'PostController @ delete');

Til slutt, la oss opprette en tilhørende kontroller på app / Http / kontrollere / PostController.php.

kan ('view', $ post)) echo "Nåværende innlogget bruker kan oppdatere innlegget: $ post-> id";  else echo 'Ikke godkjent.';  offentlig funksjon lage () // få nåværende innlogget bruker $ user = Auth :: bruker (); hvis ($ user-> kan ('opprett', Post :: klasse)) echo 'Nåværende innlogget bruker har lov til å opprette nye innlegg.';  else echo 'Ikke godkjent';  exit;  offentlig funksjon oppdatering () // få nåværende innlogget bruker $ user = Auth :: bruker (); // last innlegg $ post = Post :: finn (1); hvis ($ user-> can ('update', $ post)) echo "Gjeldende innlogget bruker har lov til å oppdatere innlegget: $ post-> id";  else echo 'Ikke godkjent.';  offentlig funksjon slette () // få nåværende innlogget bruker $ user = Auth :: bruker (); // last innlegg $ post = Post :: finn (1); hvis ($ user-> kan ('delete', $ post)) echo "Gjeldende innlogget bruker kan lov til å slette innlegget: $ post-> id";  else echo 'Ikke godkjent.'; 

Det er forskjellige måter du kan godkjenne dine handlinger ved hjelp av retningslinjer. I vårt eksempel ovenfor har vi brukt Bruker modell for å autorisere vår Post modellhandlinger.

Brukermodellen inneholder to nyttige metoder for autorisasjonsformål-kan og skrån. De kan Metoden brukes til å kontrollere om den nåværende brukeren kan utføre en bestemt handling. Og motparten av kan metode, den skrån metode, brukes til å bestemme manglende evne til å utføre handling.

La oss ta tak i bunten av utsikt metode fra kontrolleren for å se nøyaktig hva det gjør.

offentlig funksjonsvisning () // få nåværende innlogget bruker $ user = Auth :: bruker (); // last innlegg $ post = Post :: finn (1); hvis ($ user-> can ('view', $ post)) echo "Nåværende innlogget bruker kan oppdatere innlegget: $ post-> id";  else echo 'Ikke godkjent.'; 

For det første laster vi inn den innloggede brukeren, som gir oss objektet til brukermodellen. Deretter laster vi et eksempel innlegg ved hjelp av Post-modellen.

Fortsett, vi har brukt kan Brukermodellens metode til å godkjenne utsikt handling av Post modell. Det første argumentet til kan Metoden er handlingsnavnet du vil autorisere, og det andre argumentet er modellobjektet du vil bli autorisert til.

Det var en demonstrasjon av hvordan du bruker Bruker modell for å godkjenne handlingene som bruker retningslinjer. Alternativt kan du bruke Controller Helper også, hvis du er i kontrolleren mens du autoriserer en bestemt handling.

... $ this-> authorize ('view', $ post); ... 

Som du kan se, trenger du ikke å laste Brukermodellen hvis du bruker Controller Helper.

Så det var konseptet av politikk til din disposisjon, og det er veldig praktisk når du autoriserer en modell eller en ressurs som det tillater deg å gruppere autorisasjonslogikken på ett sted.

Bare vær sikker på at du ikke bruker portene og retningslinjene helt for samme handlinger av modellen, ellers vil det skape problemer. Det er det fra min side for i dag, og jeg ringer det en dag!

Konklusjon

I dag var det Laravel-autorisasjon som tok midtpunktet i artikkelen min. I begynnelsen av artikkelen introduserte jeg hovedelementene i Laravel autorisasjon, porter og politikk.

Etter det gikk vi gjennom å skape vår tilpassede port og policy for å se hvordan det fungerer i den virkelige verden. Jeg håper du har hatt glede av artikkelen og lært noe nyttig i sammenheng med Laravel.

For de av dere som enten bare er i gang med Laravel eller ønsker å utvide din kunnskap, nettsted eller søknad med utvidelser, har vi en rekke ting du kan studere på Envato Market.

Som alltid vil jeg gjerne høre fra deg i form av kommentarer ved hjelp av feedet nedenfor!