getUser()->authenticate neautorizuje uzivatele
- Finalgrab
- Člen | 15
Zdravim!
Muzete mi nekdo, prosim, jednoduse vysvetlit co se stane ve funkci authenticate, ve chvili kdy v ni probehne return new Identity ? Kam se co ulozi?
Na mych strankach probiha trochu jiny zpusob autentizace. Vyuzivam dat z cookie jine aplikace pod stejnou domenou. Nactu nejaky hash z cookie, pod kterym jsou ulozene v db prihlasovaci udaje uzivatele. Pokud tyto udaje existuji, tak se prihlasovaci formular nezobrazi, do databaze se ulozi nejaky docasny hash, provede se redirect na stejny presenter s docasnym hashem v GETu. Po redirectu, pokud je v GETu docasny hash, tak se prihlasovaci udaje poslou do funkce authenticate s tretim parametrem (podle dokumentace je tato hodnota pod indexem ‚extra‘), ktery rika, ze se nema overovat heslo, a funkce authenticate uz neoveruje v db heslo, pouze vrati new identity z prihlasovacich udaju ulozenych v DB s tim docasnym hashem. Pote se jiz normalne redirectuji na kteroukoliv jinou stranku.
V basepresenteru se vsak overuje, zda je uzivatel prihlasen a pokud ne, redirectuje se zpet na presenter Login.
Muj problem je, ze po redirectu s docasnym hasem, probehnuti funkce authenticate a po dalsim redirectu $this->getUser() stale neni prihlaseny a vytvori se smycka, kdy BasePresenter preposila vse na Login, login nacita udaje, autorizuje se a redirectuje se zpet a takhle dokolecka. Nemeta nekdo napad, pro authenticate nefunguje?
Vytah z BasePresenter ve funkci beforeRender():
<?php
$user = $this->getUser();
if(!$user->isAuthenticated() && $pres != 'Login') $this->redirect('Login:');
?>
funkce defaultRender z Login presenteru:
<?php
public function renderDefault(){
$user = $this->getUser();
if($user->isAuthenticated()) $this->redirect('HlasoveSluzby:'); //pokud je uzivatel prihlasen, redirect na uvodni stranku
else{
require_once("casa_auth.class.php"); // trida obsluhujici vyber z cookie, ukaldani docasnych hashu apod
$auth = new casa_auth($_SERVER['REMOTE_ADDR'],$_SERVER['HTTP_USER_AGENT']);
if(isset($_GET['auth_token'])){ // v redirectu poslan docasny hash
$uzivatel = $auth->get_auth_data($_GET['auth_token']); // ziskani udaju o uzivateli ze specialni databaze
if($uzivatel){
$values['username'] = $uzivatel['abra_user_login'];
$values['password'] = '';
$identity = $this->getUser()->authenticate($values['username'], $values['password'], 1); //autentizace uzivatele podle udaju ze specialni databaze bez overovani hesla (urcuje treti parametr funkce authenticate)
// zde jeste $this->getUser()->isAuthenticated() vraci TRUE, ale po redirectu BasePresenter uz vidi opak (kod vyse)
$this->redirect('HlasoveSluzby:');
}
}
else{
$udaje = array();
$udaje = $auth->check_auth(); // vytazeni udaju z DB podle hashe ulozeneho v cookie, ktery odpovida hashi ve specialni databazi
if($udaje['token']!='' && time()-strtotime($udaje['timestamp'])<1800){ // overeni ze ve specialni databazi existuje uzivatel a neni prekrocen nejaky casovy limit necinnosti
$this->redirect('Login:',array('auth_token'=>$udaje['token'])); // redirect zpet na stejny presenter (Login) s docasny hashem v GETu
}
}
}
}
?>
funkce authenticate:
<?php
public function authenticate(array $credentials)
{
$username = $credentials[self::USERNAME];
if(!$credentials['extra']){ //byl zaslan treti parametr->nebude se tedy overovat heslo
$password = $credentials[self::PASSWORD];
$prefix = "wGX0uI1tjx";
$postfix = "09GnGntFoi";
}
require_once("../app/presenters/abra_user.class.php");
$abra = new abra_user();
$result = $abra->get_user($username); // ziskani dauju o uzivateli z db uzivatelu
if (!$credentials['extra'] && $result['password_hash'] !== sha1($prefix.$username.$password.$postfix)) { // overovani hesla pri normalnim prihlasovani pres formular
throw new AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
}
$roles = array();
if($credentials['extra']) return new Identity($result['uid'], $roles, $result); // vraci new identity pouze kdyz je zadan treti parametr 'extra' -> neoveruje se heslo, jenom se tahaji data z DB
}
?>
Snazil jsem se okomentovat kod, aby bylo jasne co se deje
Editoval Finalgrab (2. 6. 2010 12:50)