Návrat na stránku s vyplněnými údaji po odhlášení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
darthcz
Člen | 113
+
0
-

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

Foowie
Člen | 269
+
0
-

Mylím že by ti mohlo pomoct storeRequest a restoreRequest

darthcz
Člen | 113
+
0
-

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

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

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

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

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

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

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

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

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.