Nefunguje odhlášení uživatele přes logout();

Higr
Člen | 11
+
0
-

Č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>

okno debuggeru

Editoval Higr (17. 4. 2019 13:15)

David Matějka
Moderator | 6445
+
+1
-

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

to jsem zkoušel, ikdyž dám logout(true); tak se na průběhu nebo výsledku odhlášení nic nezmění

CZechBoY
Člen | 3608
+
0
-

To nechápu… ty máš pro 1 cestu nastavené 2 akce, ne? Můžeš ukázat RouterFactory?

Higr
Člen | 11
+
0
-
	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
+
+5
-

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;
    }
}
Higr
Člen | 11
+
0
-

pecka fachá to, dík (y)

PandiG
Člen | 4
+
0
-

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

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

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

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

@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.