Nefunguje odhlášení uživatele přes logout();
- Higr
- Člen | 16
Čau, začínám se učit s Nette podle tutoriálů a sandboxu. Zrovna jsem chtěl zprovoznit přihlášení a odhlášení uživatele. Přihlášení proběhne v pořádku, ale odhlášení už ne. Nezobrazí se ani žádná chyba a v debug okně jsem pořád přihlášený. Jediná možnost jak se odhlásit je přes session expiration v configu, kterou mám nastavenou na 1 minutu. Projel jsem snad všechno a pořád nevím čím je to způsobený, je mi jasný že to bude nějaká pí***ina.
LoginPresenter.php
final class LoginPresenter extends Nette\Application\UI\Presenter
{
protected function createComponentLogin(): Form
{
$form = new Form;
$form->addText('username', 'Login:')
->setRequired();
$form->addText('password', 'Password:')
->setRequired();
$form->addSubmit('submit', 'Login')
->getControlPrototype()
->addClass('btn btn-primary');
$form->onSuccess[] = [$this, 'signInSucceeded'];
return $form;
}
public function signInSucceeded(Form $form, \stdClass $values)
{
try
{
$this->getUser()->login($values->username, $values->password);
$this->redirect('this');
}
catch (Nette\Security\AuthenticationException $e)
{
$form->addError('Jméno nebo heslo není správné.');
}
}
public function actionOut()
{
$this->getUser()->logout();
$this->flashMessage('Odhlášení bylo úspěšné.');
$this->redirect('this');
}
}
login.latte
<h2>Přihlášení</h2>
{control login}
<ul>
{if $user->loggedIn}
<li><a n:href="Login:out">Odhlásit</a></li>
{else}
<li>Musíte se přihlásit</li>
{/if}
</ul>
Editoval Higr (17. 4. 2019 13:15)
- David Matějka
- Moderator | 6445
ahoj, metoda logout má jeden parametr $clearIdentity
, pokud jej
nastavíš na true, tak se smaže identita uživatele. jak to máš teď, tak
dojde k jeho odhlášení (tedy isLoggedIn vrátí false), ale máš pořád
v session jeho identitu.
- Higr
- Člen | 16
public static function createRouter(): RouteList
{
$router = new RouteList;
$router->addRoute('form', 'Form:default');
$router->addRoute('edit', 'Form:edit');
$router->addRoute('history', 'History:show');
$router->addRoute('login', 'Login:login');
$router->addRoute('login', 'Login:out');
return $router;
}
}
- CZechBoY
- Člen | 3608
No jak jsem psal… zkus pro ten logout dat url treba logout
misto login
.
tzn presne takto
public static function createRouter(): RouteList
{
$router = new RouteList;
$router->addRoute('form', 'Form:default');
$router->addRoute('edit', 'Form:edit');
$router->addRoute('history', 'History:show');
$router->addRoute('login', 'Login:login');
$router->addRoute('logout', 'Login:out');
return $router;
}
}
- PandiG
- Člen | 4
Zdravím, řeším stejný problém. Mužete mi prosím poradit proč se nic nedejě když chci uživatele odhlásit? RouteFactory mam stejne jak t píše CZechBoY.
presenter
public function actionOut()
{
$this->user->logout(true);
$this->flashMessage('Odlášení bylo úspěnšé.');
$this->redirect('Login:');
}
template
{if $user->isLoggedIn()}
<a class="nav-link" n:href="Login:out">Odhlásit</a>
Editoval PandiG (5. 2. 2023 15:56)
- Marek Bartoš
- Nette Blogger | 1280
@PandiG Co znamená, že se nic neděje?
- Když klikneš na odkaz odkazující na Login:out, zavolá se actionOut()?
- Změní se po zavolání user->logout() data v session? Identita uživatele by měla ze session zmizet
- Přesměruje tě to na Login?
- PandiG
- Člen | 4
@MarekBartoš
No jakoby se ani nezavolal actionOut(), pokud do ni vložím bdump tak se ani
nedumpuje.
Nezmení se ani user->logout nemizí identita, a ani se nepřesmeruje
na Login.
edit:
Pokud actionOut() přenesu do HomepagePresenter a předělám i odkaz na '''html<a class=„nav-link“ n:href=„Homepage:out“>Odhlásit</a>''' tak aplikace se odhlasí, vypíše že odhlášeno a přesmeruje na Login. Ale pokud tu akce mám v LoginPresenter tak ne. Ani se nezavolá Nechápu že proč.
Editoval PandiG (5. 2. 2023 17:39)
- Marek Bartoš
- Nette Blogger | 1280
Nejspíš se ti matchnula routa vedoucí na jiný presenter. Jaká routa se
ti matchnula při kliknutí poznáš z Tracy routing panelu. Nejspíš máš
dvě routy s identickou cestou nebo máš méně specifickou routu před více
specifickou (např. /<presenter>
ti matchne prakticky vše a
musí být definovaná až po /logout
)
- PandiG
- Člen | 4
@MarekBartoš
Děkuji za vysvětlení.
Ze zvědavosti jsem udělal to že actionOut() jsem nechal v Login presentru a
v template jsem směroval na Homepage, a taky to fungovalo a odhálsilo mě.
Z toho jsem pochopil že to tak je proto, lebo v BasePresenteru mam
podmínku…
if (!$this->getUser()->isLoggedIn() && $this->getPresenter()->name !== 'Login' ) {
$this->redirect('Login:');
} else if ( $this->getUser()->isLoggedIn() && $this->getPresenter()->name === 'Login' ){
$this->redirect('Homepage:');
}
…a proto se akce nevolá když v template směruji na Login.
Jestli jsem to pochopil špatně tak me oprav/te.