Kdy a jak spravne autorizovat uzivatele by se mohlo zdat celkem snadne… Presto jsem nedavno narazil na kod (v produkcnim prostredi), ktery v autorizaci sice provadel, ale nedostatecne…
Co je nedostatecna autorizace?
V kodu, o kterem zde pisu, byla autorizace nedostatecna v tom, ze i kdyz uzivatel nemel dostatecna prava pro vykonani dane akce, presto ji mohl provest. A navic o tom nikdo nevedel… Ptate se jak je to mozne? Podivejte se na nasledujici kod…
class Foo extends Boo { function __construct() { if($this->user->hasRight('someAction')) { return false; } } }
Tento kod sice zjisti ze uzivatel nema dostatecna prava. Konstruktor dokonce vrati FALSE, ale to uz nezastavi aplikaci od vykonani akce. Navratovy kod konstruktoru totiz nikoho nezajima!!!
Jak to udelat lepe?
Existuji samozrejme lepsi zpusoby…
Presmerovani v konstruktoru
Vyjdeme v podstate ze stejneho kodu, jen jej trosku upravime
class Foo extends Boo { function __construct() { if($this->user->hasRight('someAction')) { $this->log('User access not alowed.'); $this->redirect('Here:allowed'); } } }
Jak muzete videt, zmenili jsme pouze dva radky. Za prve jsme si zalogovali chybu a pote jsme presmerovali uzivatele na jinou stranku, pro kterou ma dostatecna prava.
V jednom presenteru (tride) ale muzeme mit vice akci, pricemz na nektere z nich uzivatel muze mit dostatecna prava. Pokud ho ale presmerujeme uz v konstruktoru, jednoduse ho od nekterych akci na vzdy odstrihneme… Lepsi je proto resit prava primo v jednotlivych metodach
Kontrola prav primo v metode
Nejdrive si ukazme kod…
class Foo extends Boo { function __construct() { //code of constructor } function actionDoSomething() { if($this->user->hasRight(__METHOD__) { $this->log('User access not alowed.'); $this->redirect('Here:allowed'); } } }
Toto reseni se jevi jako nejcistsi, protoze umoznuje dynamicky uzivateli kontrolovat prava na jednotlive akce, nejen cele presentery ( a jejich tridy).
S Vasimi zkusenostmi ci pripominkami se podelte v komentarich pod clankem