Návrat na stránku s vyplněnými údaji po odhlášení
- darthcz
- Člen | 113
Dobrý den,
chtěl bych se zeptat, zda nette umí nějak automaticky zajistit návrat na stránku, ze které jsem byl z důvodu neaktivity odhlášen.
Například vyplňuji formulář, nechám ho rozdělaný a např. na hodinu odejdu. Po doplnění údajů a kliknutí na vložit mě to pošle na login, protože jsem byl odhlášen z důvodu neaktivity. Lze udělat, pokud se v tuto chvíli přihlásím, aby mě to vrátilo na ten formulář i s vyplněnými údaji, které jsem tam měl?
Za odpověď děkuji
- darthcz
- Člen | 113
Funguje bezvadně. Snad jen jak zajistit, aby se neukládal request při kliknutí na odhlásit?
Stalo se mi, že jsem přišel, klikl na odhlásit, byl jsem odhlášen z důvodu neaktivity a při přihlášení mi proběhlo odhlášení, na které jsem klikl, což nebylo zrovna žádoucí :(
Díky moc.
- bojovyletoun
- Člen | 667
Stává se tahle situace často (jak kn ní dojde)? Podívej se na příklad CD collection, jak je to tam řešené. Já jsem to na tom příkladu zkusil: login,smazat cookie, logout, login – a zůstanu přihlášený. Zkusil jsi to taky tak?
- darthcz
- Člen | 113
bojovyletoun: Jde spíš o to, že když mě to odhlásí z důvodu neaktivity, tak ukládám, na co uživatel klikl, než ho to přesměrovalo na login (storeRequest) a po opětovném přihlášení ho přesměruji tak, aby proběhla akce, na kterou klikl (restoreRequest – odeslání formuláře, odhlášení, výpis klientů…).
Funguje to tak jak má. Problém je že si to pamatuje i kliknutí na odhlášení, což je sice správně, ale je to pro mě nežádoucí. Potřeboval bych způsob, jak zjistit, zda poslední request bylo kliknutí na odhlásit (actionLogout) a v takovém případě nevolat funkci storeRequest.
- bojovyletoun
- Člen | 667
zkoušel jsem to na příkladu cd collection, dal jsem expiraci na 3s a
nepovedlo se mi to nasimulovat.
Otázka je, zda máš na přihlášení a odhlášení jiný presenter než na
zbytek webu. Tak je to i v příkladu. Jsem přihlášen, 4s počkám, kliknu
na logout, jsem odhlášen(a redirectován na login a žádný backlink se
nepřenáší) přihlásím se a jede to. /Protože z Login/Logout presenteru
se žádný storereqest nevytváří.
Právě to si tipuji, že v daném presenteru jsou i při/od|hlašovací metody i ostatní.
Editoval bojovyletoun (19. 1. 2011 18:55)
- LuKo
- Člen | 116
darthcz napsal(a):
Funguje to tak jak má. Problém je že si to pamatuje i kliknutí na odhlášení, což je sice správně, ale je to pro mě nežádoucí. Potřeboval bych způsob, jak zjistit, zda poslední request bylo kliknutí na odhlásit (actionLogout) a v takovém případě nevolat funkci storeRequest.
Zkontroluj, jestli v presenteru, kde máš actionLogout
není
zároveň metoda startup
(nebo jakkoli jinak pojmenovaná), kde
dochází ke kontrole, zda je uživatel přihlášený. Případně zda tuto
metodu nedědíš.
- darthcz
- Člen | 113
Vypadá to zhruba takto:
LoginPresenter.php
use Nette\Application\AppForm;
use Nette\Forms\Form;
use Nette\Web\User;
class LoginPresenter extends BasePresenter {
private $backlink = '';
function __construct() {
parent::__construct();
self::$model = new LoginModel();
}
protected function createComponentLoginForm() {
$form = new AppForm;
$form->addText('email', 'E-mail:')
->addRule(Form::FILLED, 'Prosíme, vyplňte svůj email.');
$form->addPassword('password', 'Heslo:')
->addRule(Form::FILLED, 'Prosíme, vyplňte heslo.');
$form->addSubmit('login', 'Přihlásit se');
$form->onSubmit[] = callback($this, 'loginFormSubmitted');
return $form;
}
public function actionLogin($backlink = NULL){
if (isset($backlink))
$this->backlink = $backlink;
}
public function loginFormSubmitted($form) {
try {
$values = $form->values;
$user = new User;
// přihlášení
$authenticator = new MyAuthenticator();
$user->setAuthenticationHandler($authenticator);
$user->login($values['email'], $values['password']);
if ($user->isLoggedIn()){
//nastavim cas vyprseni session - doba odhlaseni z duvodu neaktivity
Nette\Environment::getUser()->setExpiration('+ 3 hours');
//toto se provede při úspěšném zpracování přihlašovacího formuláře
if (!empty($this->backlink))
$this->getApplication()->restoreRequest($this->backlink);
$this->redirect('Customers:show');
}
else
throw new Nette\Security\AuthenticationException('Špatný e-mail nebo heslo!');
} catch (Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
}
public function actionLogout(){
Nette\Environment::getUser()->logout();
$this->flashMessage('Byl jste úspěšně odhlášen!');
$this->redirect('Login:login');
}
}
BasePresenter.php
use Nette\Environment;
abstract class BasePresenter extends Nette\Application\Presenter {
protected static $model;
//funkce, ktera zajisti zakazani pristupu neprihlasenym uzivatelum
protected function startup(){
parent::startup();
$user = Environment::getUser();
//pokud se nejedná o stránku s přihlášením
if ($this->getAction() != 'login') {
//pokud uzivatel neni prihlasen, posleme ho na login
if (!Environment::getUser()->isLoggedIn()){
if ($user->getLogoutReason() === Nette\Web\User::INACTIVITY)
$this->flashMessage('Byl jste odhlášen z důvodu své neaktivity. Prosím, přihlašte se znovu.');
//ulozim pozadavek pro akci pred kterou jsme byli odhlaseni
$backlink = $this->getApplication()->storeRequest('+ 48 hours');
$this->redirect('Login:login', $backlink);
}
//pokud je uzivatel prihlasen, zkontrolujeme, zda je pro vstup do sekce autorizovan
if (Environment::getUser()->isLoggedIn()){
if (!(Environment::getUser()->isAllowed($this->name, $this->view))){
$this->flashMessage('Pro vstup na danou stránku nemáte oprávnění!');
$this->redirect('Login:login');
}
}
$this->template->logged_user = $user->getIdentity()->getID();
}
}
}
- LuKo
- Člen | 116
BasePresenter.php
<?php
use Nette\Environment;
abstract class BasePresenter extends Nette\Application\Presenter {
protected static $model;
//funkce, ktera zajisti zakazani pristupu neprihlasenym uzivatelum
protected function startup(){
parent::startup();
//pokud se nejedná o stránku s přihlášením
if ($this->getAction() !== 'login' && $this->getAction() !== 'logout') { // ZMĚNA: uživatele nechceš kontrolovat při loginu ani při logoutu
$user = Environment::getUser(); // ZMĚNA: přesunuto do podmínky, mimo ni je to zbytečné
//pokud uzivatel neni prihlasen, posleme ho na login
if (!$user->isLoggedIn()){ // ZMĚNA: uživatele už máš v proměnné $user, nahrazeny i další výskyty
if ($user->getLogoutReason() === Nette\Web\User::INACTIVITY)
$this->flashMessage('Byl jste odhlášen z důvodu své neaktivity. Prosím, přihlašte se znovu.');
//ulozim pozadavek pro akci pred kterou jsme byli odhlaseni
$backlink = $this->getApplication()->storeRequest('+ 48 hours');
$this->redirect('Login:login', $backlink);
}
//pokud je uzivatel prihlasen, zkontrolujeme, zda je pro vstup do sekce autorizovan
if ($user->isLoggedIn()){
if (!($user->isAllowed($this->name, $this->view))){
$this->flashMessage('Pro vstup na danou stránku nemáte oprávnění!');
$this->redirect('Login:login');
}
}
$this->template->logged_user = $user->getIdentity()->getID();
}
}
}
?>
- darthcz
- Člen | 113
Funguje suprově. Díky moc.
Ještě jsem se chtěl zeptat. Mám nastaveno u loginu
Nette\Environment::getUser()->setExpiration(‚+ 3 hours‘);
Pokud tam dám 10 sekund, tak se mi po vypršení vypíše hlášení z
if ($user->getLogoutReason() === Nette\Web\User::INACTIVITY)
$this->flashMessage(‚Byl jste odhlášen z důvodu své neaktivity.
Prosím, přihlašte se znovu.‘);
A všechno je správně. Pokud ale nechám ty tři hodiny, tak mě to odhlásí už třeba po hodině a půl, nevypíše se nic a
$user->getLogoutReason() je v tomto případě prázdné :(
Nevíte, co by to mohlo způsobovat?
- bojovyletoun
- Člen | 667
Nastavuješ i expiraci session? (info ) – rámeček. Jinak nevím, čím to je, protože je to do 3 hodin. Zkontroloval jsi parametry u User::setexpiration()
Třeba v opeře mi nefunguje permalogin, ve slowfoxu a ie ano.