NS\Identity() nevracia identitu
- vaziviru
- Člen | 8
Zdravím, začal som si robiť jednoduchý prihlasovací formulár a nastal
problém že NS\Identity()
mi nevracia identitu, keďže
$user->isLoggedIn()
nič nenajde, a ani v developer
tools/network v browseri nevidím žiadne cookies. Kód ktorí aktuálne mám,
je nižšie. Skúšal som namiesto return new NS\Identity
použiť
new NS\Identity
; vyprázdniť cache v nette aj cookies
v prehliadači, ale nič nepomohlo.
namespace App\FrontModule\Presenters;
use Nette\Application\UI\Form;
use Nette\Security\Passwords;
use Nette\Security as NS;
*
*
*
public function signInSucceeded($form)
{
$values = $form->getValues();
/* Get from database insertet username */
$user = $this->database->table('users')->where('username', $values['username'])->fetch();
/* Exist username in database ? */
if (!empty($user)) {
/* Verify password with database */
$verifyPassword = Passwords::verify($values['password'], $user->password);
} else {
echo "<h1 style='color: white;'>User with that name doesnt exist</h1>";
}
/* It was verify successfully ? */
if (@$verifyPassword === true) {
echo "<h1 style='color: white;'>Password is right</h1>";
/* Return identity to user */
return new NS\Identity($user->id, $user->role, ['username' => $user->username]);
} else if (@$verifyPassword === false) {
echo "<h1 style='color: white;'>Password is wrong</h1>";
}
}
public function renderIn()
{
$user = $this->getUser();
if ($user->isLoggedIn()) {
echo "<h1 style='color: white;'>!!!authorized</h1>";
} else {
echo "<h1 style='color: white;'>Fail</h1>";
}
}
Editoval vaziviru (24. 1. 2018 2:12)
- Šaman
- Člen | 2666
Proč nezačneš na Nette\Sandbox
? Tam to je ukázané a
funkční.
Použití new NS\Identity()
ti samozřejmě vrátí
vytvoří novou identitu (nebo vyhodí výjimku, když selže konstruktor), co
jiného by ti to vracelo? Ale ty to pak vrátíš někam do neznáma, takže
nejspíš zahodíš (metoda signInSucceeded
má něco udělat, ne
vracet).
TA identita uživatele, se kterou se většinou pracuje už je vytvořená
$presenter->getUser()
a přihlášení nad tímto objektem
probíhá pomocí $user->login($username, $password)
.
Editoval Šaman (24. 1. 2018 11:03)
- David Matějka
- Moderator | 6445
jak psal saman, vracis/vytvaris tu identitu do neznama.
Koukni se, jak je to v sandboxu a jak je tam implementovany authenticator
pripadne muzes bez authenticatoru predat tu vytvorenou Identitu do metody login (namisto predavani username a password)
- Ondřej Kubíček
- Člen | 494
@vaziviru ale ta metoda signInSucceeded se nikam nevrací, ty ten
login musíš udělat tak jak píše Šaman přes $user->login()
a někam si naimplementovat Nette\Security\IAuthenticator
jak je to
třeba v sandboxu https://github.com/…rManager.php#L40
- Šaman
- Člen | 2666
vaziviru napsal(a):
Písal som vyššie že som to pôvodne skúšal bez
return
a nefungovalo to, takže toto mi problém nespôsobuje.
Sorry, že to píšu takhle natvrdo, ale tvůj problém způsobuje neznalost
OOP a možná i dalších základů. Bez return
je to jen
příkaz, aby se vytvořila nová instance Identity
. Ale ty s ní
dál nic neděláš. Prostě chvíli někde je a po skončení php scriptu se
zase automaticky zahodí. Mít na řádku jen new Identity(…);
by
tě mělo samo o sobě praštit do očí.
Takových záseků asi budeš mít spoustu, jestli nechceš začít na sandboxu a nějaké předpřipravené struktuře projektu. Vypadá to, že přepisuješ nějaký hodně starý script do Nette. To už vyžaduje dost zkušeností. O hodně víc, než začít jednoduchý projekt zavedenými postupy, které se opakují v sandboxu, v dokumentaci i v různých ukázkových projektech…
Editoval Šaman (24. 1. 2018 17:38)