Astăzi, vom discuta despre sistemul de autorizare al cadrului web Laravel. Cadrul Laravel implementează autorizația sub formă de porți și politici. După o introducere la porți și politici, voi demonstra conceptele prin implementarea unui exemplu personalizat.
Presupun că sunteți deja conștient de sistemul de autentificare încorporat Laravel, deoarece este ceva esențial pentru a înțelege conceptul de autorizare. Evident, sistemul de autorizare funcționează împreună cu sistemul de autentificare pentru a identifica sesiunea legitimă de utilizator.
Dacă nu sunteți conștient de sistemul de autentificare Laravel, aș recomanda foarte mult să treceți prin documentația oficială, care vă oferă o înțelegere detaliată a subiectului.
Până acum, ar trebui să știți deja că sistemul de autorizare Laravel vine în două porți arome și politici. Deși poate suna ca o afacere complicată, aș spune că este destul de ușor să o implementezi odată ce vei avea parte de ea!
Gates vă permite să definiți o regulă de autorizare utilizând o abordare bazată pe închidere simplă. Cu alte cuvinte, atunci când doriți să autorizați o acțiune care nu este legată de un anumit model, poarta este locul perfect pentru a implementa această logică.
Să aruncăm o privire rapidă la ceea ce arata autorizația bazată pe poartă:
... poarta :: define ('update-post', functie ($ user, $ post) return $ user-> id == $ post-> user_id;); ...
Fragmentul de mai sus definește regula de autorizare update-post
pe care le puteți apela de oriunde din cererea dvs..
Pe de altă parte, ar trebui să utilizați politici atunci când doriți să grupați logica de autorizare a oricărui model. De exemplu, să presupunem că aveți un model Post în aplicația dvs. și doriți să autorizați acțiunile CRUD ale acelui model. În acest caz, este politica pe care trebuie să o implementați.
clasa PostPolicy funcția publică public (User $ user, Post $ post) funcția publică create (User $ user) public funcția update (User $ user, Post $ post) $ post)
După cum puteți vedea, este o clasă de politică destul de simplă care definește autorizarea pentru acțiunile CRUD ale Post
model.
Aceasta a fost o introducere la porțile și politicile din Laravel. Din următoarea secțiune, vom trece printr-o demonstrație practică a fiecărui element.
În această secțiune, vom vedea un exemplu din lumea reală pentru a înțelege conceptul de porți.
De cele mai multe ori, ajungeți la furnizorul de servicii Laravel atunci când trebuie să înregistrați o componentă sau un serviciu. După această convenție, să mergem mai departe și să definim poarta noastră personalizată în app / Furnizori / AuthServiceProvider.php
așa cum se arată în fragmentul următor.
'Aplicații \ Politici \ ModelPolicy',]; / ** * Înregistrați orice servicii de autentificare / autorizare. * * @return void * / boot public funcția () $ this-> registerPolicies (); Gate :: define ('update-post', functie ($ user, $ post) return $ user-> id == $ post-> user_id;);
În cizmă
metodă, ne-am definit poarta personalizată:
Gate :: define ('update-post', functie ($ user, $ post) return $ user-> id == $ post-> user_id;);
În timp ce definim o poartă, este nevoie de o închidere care returnează fie TRUE, fie FALSE bazată pe logica de autorizare definită în definiția porții. În afară de funcția de închidere, există și alte modalități prin care puteți defini porțile.
De exemplu, următoarea definiție a porții numește acțiunea controlerului în locul funcției de închidere.
Gate :: define ('update-post', 'ControllerName @ MethodName');
Acum, să mergem mai departe și să adăugăm un traseu personalizat, astfel încât să putem trece printr-o demonstrație a modului în care funcționează autorizația bazată pe poartă. În ruta fișier rute / web.php
, să adăugăm următoarea rută.
Traseu: get ('service / post / gate', 'PostController @ gate');
Să creăm un fișier de controler asociat app / HTTP / Controllers / PostController.php
de asemenea.
În cele mai multe cazuri, veți termina cu ajutorul fie
permite
sauneagă
metodă aPoartă
fațadă pentru a autoriza o anumită acțiune. În exemplul nostru de mai sus, am folositpermite
pentru a verifica dacă utilizatorul curent este capabil să efectuezeupdate-post
acțiune.Utilizatorii cu ochi ascuțiți ar fi observat că am trecut doar al doilea argument
$ postare
la închidere. Primul argument, actualul utilizator logat, este injectat automat de cătrePoartă
faţadă.Deci, așa trebuie să folosiți porțile pentru a autoriza acțiuni în aplicația dvs. Laravel. Următoarea secțiune se referă la modul de utilizare a politicilor, dacă doriți să implementați autorizația pentru modelele dvs..
Politici
Așa cum am discutat mai devreme, când doriți să grupați logic acțiunile dvs. de autorizare pentru un anumit model sau resursă, este politica pe care o căutați.
În această secțiune, vom crea o politică pentru modelul Post care va fi utilizat pentru a autoriza toate acțiunile CRUD. Presupun că ați implementat deja modelul Post în aplicația dvs.; în caz contrar, ceva similar va face.
Laravelul
artizan
comanda este cel mai bun prieten al tău atunci când vine vorba de crearea unui cod stubat. Puteți utiliza următoarea comandă artizanală pentru a crea o politică pentru modelul Post.$ php artisan face: politica PostPolicy --model = PostDupă cum puteți vedea, l-am furnizat
--Modelul = Post
astfel încât să creeze toate metodele CRUD. În absența acesteia, va crea o clasă politică necompletată. Puteți localiza clasa politică nou creată laapp / Politici / PostPolicy.php
.Să o înlocuim cu următorul cod.
id> 0; / ** * Determinați dacă utilizatorul poate actualiza postarea. * * @param \ App \ Utilizator $ user * @param \ App \ Post $ post * @return mixt * / public function update (user $ user, Post $ post) return $ user-> id == $ post-> numele de utilizator; / ** * Determinați dacă utilizatorul poate șterge postul. * * @param \ App \ Utilizator $ user * @param \ App \ Post $ post * @return mixt * / funcția publică șterge (user $ user, Post $ post) return $ user-> id == $ post-> numele de utilizator;Pentru a putea folosi clasa noastră de politică, trebuie să o înregistrăm folosind furnizorul de servicii Laravel așa cum se arată în fragmentul următor.
'Aplicații \ Politici \ ModelPolicy', Post :: class => PostPolicy :: class]; / ** * Înregistrați orice servicii de autentificare / autorizare. * * @return void * / boot public funcția () $ this-> registerPolicies ();Am adăugat cartografierea politicii noastre în
politicile $
proprietate. Aceasta îi spune lui Laravel să apeleze la metoda corespunzătoare a politicii pentru a autoriza acțiunea CRUD.De asemenea, trebuie să înregistrați politicile utilizând
registerPolicies
, așa cum am făcut încizmă
metodă.Mutarea mai departe, să creăm câteva trasee personalizate în
rute / web.php
astfel încât să putem testa metodele noastre de politică acolo.Route :: get ("serviciu / post / vizualizare", "PostController @ view"); Route :: obțineți ('service / post / create', 'PostController @ create'); Route :: get (serviciu / post / update ',' PostController @ update '); Route :: get ('service / post / delete', 'PostController @ delete');În cele din urmă, să creăm un controler asociat la
app / HTTP / Controllers / PostController.php
.can ('view', $ post)) echo "Utilizatorul conectat curent are permisiunea de a actualiza mesajul: $ post-> id"; altceva echo 'Nu este autorizată.'; funcția publică create () // obține curentul autentificat user $ user = Auth :: user (); dacă ($ user-> can ('create', Post :: class)) echo 'Utilizatorul curent înregistrat este autorizat să creeze mesaje noi.'; altceva echo 'Nu este autorizată'; Ieșire; public function update () // obtine curent autentificat user user = Auth :: user (); // încărcare post $ post = Post :: find (1); dacă ($ user-> can ('update', $ post)) echo "Utilizatorul conectat curent are permisiunea de a actualiza mesajul: $ post-> id"; altceva echo 'Nu este autorizată.'; funcția publică șterge () // obține curentul autentificat în user $ user = Auth :: user (); // încărcare post $ post = Post :: find (1); dacă ($ user-> can ('delete', $ post)) echo "Utilizatorul curent înregistrat poate să șterge mesajul: $ post-> id"; altceva echo 'Nu este autorizată.';Există modalități diferite de a vă autoriza acțiunile utilizând Politica. În exemplul nostru de mai sus, am folosit
Utilizator
model pentru a ne autorizaPost
acțiuni de model.Modelul utilizatorului oferă două metode utile în scopul autorizării-
poate sa
șisupraînălțare
.poate sa
metoda este utilizată pentru a verifica dacă utilizatorul curent este capabil să execute o anumită acțiune. Și omologul luipoate sa
metodă,supraînălțare
, este utilizată pentru a determina incapacitatea executării acțiunii.Să luăm fragmentul
vedere
metodă de la controlor pentru a vedea exact ce face.funcția publică funcția () // obține curentul autentificat în user $ user = Auth :: user (); // încărcare post $ post = Post :: find (1); dacă ($ user-> can ('view', $ post)) echo "Utilizatorul curent este autentificat să poată actualiza mesajul: $ post-> id"; altceva echo 'Nu este autorizată.';În primul rând, încărcăm utilizatorul conectat în prezent, ceea ce ne face obiectul modelului Utilizator. Apoi, încărcăm un exemplu de post utilizând modelul Post.
Mergând înainte, am folosit
poate sa
metoda modelului de utilizator pentru a autorizavedere
acțiuneaPost
model. Primul argument alpoate sa
este numele de acțiune pe care doriți să-l autorizați, iar al doilea argument este obiectul model pe care doriți să-l autorizați.Aceasta a fost o demonstrație a modului în care să se folosească
Utilizator
pentru a autoriza acțiunile care utilizează politici. Alternativ, ați putea folosi Controler Helper de asemenea, dacă vă aflați în controler, autorizând o anumită acțiune.... $ this-> authorize ('vizualizare', $ post); ...După cum puteți vedea, nu este necesar să încărcați modelul de utilizator dacă utilizați Controler Helper.
Așa că a fost conceptul de politici la dispoziția dumneavoastră și este într-adevăr la îndemână în timp ce autorizați un model sau o resursă deoarece vă permite să grupați logica de autorizare într-un singur loc.
Asigurați-vă că nu utilizați porți și politici în totalitate pentru aceleași acțiuni ale modelului, altfel va crea probleme. Asta e de partea mea pentru azi și o voi numi o zi!
Concluzie
Astăzi, a fost autorizarea Laravel care a luat etapa centrală în articolul meu. La începutul articolului am introdus principalele elemente ale autorizației, porților și politicilor Laravel.
Ca urmare, am trecut prin crearea poarta și politica noastră personalizată pentru a vedea cum funcționează în lumea reală. Sper că v-ați bucurat de acest articol și ați învățat ceva util în contextul lui Laravel.
Pentru cei care sunteți fie doar începători cu Laravel, fie căutați să vă extindeți cunoștințele, site-ul sau aplicația cu extensii, avem o varietate de lucruri pe care le puteți studia pe piața Envato.
Ca întotdeauna, mi-ar plăcea să aud de la dvs. sub formă de comentarii folosind feed-ul de mai jos!