getUser()->authenticate neautorizuje uzivatele

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Finalgrab
Člen | 15
+
0
-

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)