Přihlášení uživatel přes UserManager
- Jan Blažek
- Člen | 36
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
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.
- ViPEr*CZ*
- Člen | 818
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á.