Sign komponenta vs problém s backlink
- thm
- Člen | 147
Zdravím Vás, předělal jsem si SignPresenter ze sandboxu do komponenty a mám takový problém, se kterým si nevím rady, nebo prostě něco přehlížím.
Komponenta:
class Sign extends BaseControl{
/** @var User */
private $user;
public function __construct(User $user){
$this->user = $user;
}
/**
* Sign-in form factory.
* @return Form
*/
public function createComponentSignInForm(){
$form = new Form;
$form->addText('email', 'Email:')
->setRequired('Prosím zadejte svoji emailovou adresu.')
->addRule(Form::EMAIL, 'Emailová adresa obashuje chybu.')
->setType('email')
->setAttribute('placeholder', 'jan@novak.cz');
$form->addPassword('password', 'Heslo:')
->setRequired('Prosím zadejte své heslo.')
->setAttribute('placeholder', 'heslo');
$form->addCheckbox('remember', 'Neodhlašovat');
// stores backlink in hidden form value
$form->addHidden('backlink', $this->presenter->getParameter('backlink'));
$form->addSubmit('send', 'Přihlásit');
// call method signInFormSucceeded() on success
$form->onSuccess[] = $this->signInFormSucceeded;
return $form;
}
public function signInFormSucceeded(Form $form){
$values = $form->getValues();
if ($values->remember) {
$this->user->setExpiration('14 days', FALSE);
} else {
$this->user->setExpiration('20 minutes', TRUE);
}
try {
$this->user->login($values->email, $values->password);
} catch (\Nette\Security\AuthenticationException $e) {
$form->addError($e->getMessage());
}
if($form->hasErrors()) return $form;
$this->presenter->flashMessage('Přihlášení proběhlo úspěšně', 'info');
// if backlink is stored, redirects to backlink
if(isset($values->backlink)) $this->presenter->restoreRequest($values->backlink);
// else redirects to homepage
$this->presenter->redirect('homepage:default');
}
public function render(){
//render
}
}
BaseSecuredPresenter:
class BaseSecuredPresenter extends BasePresenter{
public function startup() {
parent::startup();
// Redirects to Sign:in, if user is not logged in
if (!$this->user->isLoggedIn()) {
if ($this->user->logoutReason === \Nette\Http\UserStorage::INACTIVITY) {
$this->flashMessage('Byli jste odhlášeni z důvodu 20ti minutoné neaktivity');
}
$this->redirect(':FrontEnd:Sign:in', array('backlink' => $this->storeRequest()));
}
}
Vše funguje dobře, takže když přistupuju k presenteru děděného od BaseSecuredPresenteru, tak mě to přesměruje na login. Pokud zadám jméno heslo, následuje redirect na stránku, na kterou jsem původně chtěl jít. Pak jsem si ale všiml, že někdy mě to po přihlášení přesměruje na homepage:default (resp. nesplní se podmínka if(isset($values->backlink)) $this->presenter->restoreRequest($values->backlink);) a pokračuje dál na redirect homepage:default
Pokud se odhlásím, kliknu na administraci (ext. BaseSecuredPresenter), jsem přesměrován na Sign:in. Pokud se znovu přihlásím pod stejným uživatelským účtem je vše v pořádku. Přesměruje mě to do administrace.
Pokud se odhlásím se, kliknu na administraci (ext. BaseSecuredPresenter), jsem přesměrován na Sign:in a pokud se přihlásím jako jiný uživatel podmínka se nesplní (asi – nebo je zatím něco hlouběji) a jsem po přihlášení přesměrován na Homepage:default. A to přestože mě po kliku na administraci přesměruje na stránku sign:in kde v odkazu opravdu je /prihlaseni/?backlink=95r6g.
Editoval thm (16. 7. 2014 17:09)
- newPOPE
- Člen | 648
Neblbne Vam tam session expiration vid https://api.nette.org/…ter.php.html#… Default je na 10min.
- thm
- Člen | 147
@pupitooo Bohužel nevím. Myslím, že jsem to nakonec vzdal.
@newPOPE Pokud by mělo jít o to, že request uložený v session
během 10 minut vyprší, tak tím to pravděpodobně nebylo, protože jsem to
určitě zkoušel odhlašovat/přihlašovat během chvíle.
Až bude čas, vyzkouším to na čistém sandboxu.