NS\Identity() nevracia identitu

vaziviru
Člen | 8
+
0
-

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
+
+1
-

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)

vaziviru
Člen | 8
+
0
-

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.

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

@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
+
0
-

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)

vaziviru
Člen | 8
+
0
-

Nakoniec sa mi to podarilo rozbehnúť vďaka tomu sandboxu, presnejšie dorobením modelu s funkciov authenticate a použitím login().