Přihlášení uživatel přes UserManager

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

Nette se učim poměrně chvilku a chtěl bych se zeptat jak mám docílit toho, aby se mi uložila identita a přihlásil se mi člověk.
v UserManager.php mám

	public function authenticate(array $credentials)
	{
		list($username, $password) = $credentials;

		$row = $this->database->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();

		if (!$row) {
			$this->flash = 'Příhlašovací jméno není zaregistrováno';
        $this->flashtype = 'danger';
		} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
			$this->flash = 'Nesprávné heslo';
        $this->flashtype = 'danger';

		} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
			$row->update([
				self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
			]);
		} else{
    	$this->flash = '<strong>Úspěšně</strong> jsi byl příhlášen!';
        $this->flashtype = 'success';
        $arr = $row->toArray();
        unset($arr[self::COLUMN_PASSWORD_HASH]);
        unset($arr[self::COLUMN_NAME]);
        return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
}
	}

I když se mi do flash nahraje zpráva o úspěšném přihlášení, tak se mi podmínka v layoutu $user->IsLoggedIn() vyhodnotí jako false. Na tuto funkci volám po úspěšném odeslání formuláře z HomepagePresenteru.

public function LoginSucceeded(Form $form, $values){
     $this->UserManager->authenticate(array($values->username, $values->password));
     $this->flashMessage($this->UserManager->flash, $this->UserManager->flashtype);
 }

A ještě se zeptám na pole $arr, to mi vrátí všechny atributy pod řádkem s username hráče? (Myslím si že ano, ale chtěl bych si to ověřit)
Předem děkuji za všechny odpovědi.

Editoval Jan Blažek (1. 4. 2017 17:53)

uestla
Backer | 799
+
+2
-

Ahoj.

Předpokládám, že používáš UserManager ze sandboxu, jen sis ho upravil.

Uložení identity probíhá v instanci Usera, takže místo použití UserManagera volej v presenteru

$this->getUser()->login($values->username, $values->password);

$flash a $flashtype v UserManageru neměj. Nech tam vyhození výjimky a v presenteru obal přihlášení do try-catch a podle chycené výjimky přidávej tu kterou flash message.

Jan Blažek
Člen | 36
+
0
-

Díky moc za radu, už mi to funguje :)

MKI-Miro
Člen | 279
+
0
-

aky je rozdiel medzi

$this->user->login

a

authenticate v UserManager

(v sanndbox-e nikde nevidim aby sa niekde volala funkcia authenticate v UserManager)

dakujem

ViPEr*CZ*
Člen | 818
+
+2
-

UserManager implementuje rozhranní Nette\Security\IAuthenticator
$this->user->login je metoda frameworku, která nějak v pozadí získává objekt typu IAuthenticator (onen UserManager musí být zaregistrovaný v config.neonu) a nad ním volá metodu authenticate (deklaruje jí právě rozhranní IAuthenticator).
User je tedy objekt představující uživatele, který nám předkládá framework. Ten v sobě nese objekt, který umí uživatele autentizovat (IAuthenticator). Tento objekt je možné libovolně definovat a mechanizmus autentizace si tak napsat jednoduše vlastní. Login už pak jen tento náš mechanizmus volá.