po odhlaseni a stlaceni browser tlacitka „back“ zistim ze niesom odhlaseny

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

bezi mi PHP 5.3 a neprefixovana 2.0 verzia Nette

cize mam BasePresenter a v nom funkciu:

<?php
public function confirmAuthentication(){
	$this->user = $this->getUserObject();
	if( $this->user->isLoggedIn() ){
		$this->template->isUserLoged = true;
		$this->template->identity = $this->user->getIdentity()->getId();
		$this->template->identityData = $this->user->getIdentity()->getRoles();
	}
	else{
		$this->template->isUserLoged = false;
		$this->template->logoutReason = $this->user->getLogoutReason();
	        if ($this->user->getLogoutReason() === User::INACTIVITY) {
         	    $this->template->logoutReason = 'You have been logged out due to inactivity. Please login again.';
	        }
		 elseif ($this->user->getLogoutReason() === User::MANUAL) {
  			  $this->template->logoutReason = 'You have been succesfully logged out.';
		}
		else{
			$this->template->logoutReason = null;
		}
	}
}
?>

v detskom presenteri mam defaultRender metodu, kde si overim, ci je uzivatel prihlaseny zavolanim tejto metody z materskeho presenteru:

<?php
  $this->template->logoutReason = $this->confirmAuthentication();
?>

a potom tam mam dalsiu handle metodu, ktora odhlasuje ked prihlaseny user klikne na linku „odhlasit“:

<?php
  public function handleLogout(){
  	$user = $this->getUser();
		// uživatelova identita bude smazána - hodí se u případů,
		// kdy je počítač sdílený a chci se odhlásit
		// a nezanechat po sobě žádné osobní údaje
		$user->logout(true);
		//$this->redirect('this');
	}
?>

No a problemy su dva:

  1. Ten vaznejsi je, ze po odhlaseni vypise ze uspesne prebehlo odhlasenie, ale ked dam „back“, tak si vypyta browser reload a som zasa prihlaseny.
  2. Ten menej vazny je, ze neviem, ako sa zbavit tych oznamov o uspesnom prihlaseni, ked kliknem na inu stranku, stale mi svieti: „You have been succesfully logged out“. Viem, ze je to tym, ze som to do template priradil z BasePresenteru, ale ked kliknem na inu stranku ⇒ iny presenter, tak tam mam opat renderDefault, ten sa pozrie do BasePresenteru a ten by mal pozriet ze som neni prihlaseny a zobrat tu poslednu podmienku else, t.j. $this->template->logoutReason = null;

ale vobec to tak nefunguje.
Poprosim o rady, vdaka

Jan Tvrdík
Nette guru | 2595
+
0
-

$this->template->logoutReason = $this->confirmAuthentication();

Proč přiřazuješ do $logoutReason výsledek metody, která nic nevrací?

Chbox
Člen | 125
+
0
-

…a do tamplate ty proměnný taky posílat nemusíš, když je user v Nette2 dostupný i v šablonách.

dubak
Člen | 41
+
0
-

Jan Tvrdík napsal(a):

$this->template->logoutReason = $this->confirmAuthentication();

Proč přiřazuješ do $logoutReason výsledek metody, která nic nevrací?

No, vyzera to na prvy pohlad skutocne tak, ale v detskom presenteri, ktory rozsiruje BasePresenter mam renderDefault() a ten mi zavola funkciu confirmAuthentication(), ktora je vtom BasePresenteri, aby mi tato funkcia nastavila do sablony hodnoty:

<?php
$this->template->isUserLoged = true;
$this->template->identity = $this->user->getIdentity()->getId();
$this->template->identityData = $this->user->getIdentity()->getRoles();
?>

v sablone potom na zaklade hodnoty isUserLoged zobrazi formular ze som prihlaseny aj s informaciami z DB, alebo ak niesom, tak zobrazi prihlasovaci formular.

No a ten problem s browserovym „back“ button som si vsimol, ze aj tuto na fore sa odhlasim. Potomstlacim „back“ a po potvrdeni sa mi zobrazia moje udaje ako keby som prihlaseny. Skusil som potom len tak pridat komentar do diskusie, a vtedy mi napisalo „nemate potrebna opravneni“ a presmerovalo na prihlasenie. Mi to pripada take divne, ja by som nemal moznost sa dostat do vnutra ani po stlaceni „back“ buttonu a uvidiet nejake informacie. Ked si pisem vlastnu login management triedu, tak po stlaceni „odhlasit“ zmazem vsetky cookies, presmerujem na tu istu stranku a potom uz nema uzivatel sancu vidiet obsah svojho konta pokym sa opat neprihlasi.

Ten druhy problem je to, ze ak sa odhlasim manualne, tak som si myslel, ze ked v renderDefault metode zavolam spominanu metodu confirmAuthentication(), tak ta sa cez if else vetvenie dostane az na podmienku:

<?php
else{
   $this->template->logoutReason = null;
}
?>

a ta mi nastavi premennu do sablony na prazdnu. Ide o to, ze ked sa odhlasim, tak vidim ten spravny dovod odhlasenia. Ale potom prekliknem v menu na inu zalozku a chcem, aby mi tam uz nevypisovalo ten oznam: You have been succesfully logged out.

Aby som uviedol podrobnosti, pouzil som styl, ktory tu opisuje kucharka, cize jednoduchy staticky web, kde kazdy preklik v menu na inu zalozku reprezentuje iny presenter a ten ma jeden matersky (BasePresenter), do ktoreho som napisal osetrenie prihlasovania a odhlasovania. Nechcem teraz riesit ci je to dobry postup, MVP filozofiu riesim 2 tyzdne a dostavam sa do toho. Ide mi o to, ci je mozne s takto napisanou hierarchiou vyriesit problem zobrazovania logout dovodov, alebo mam proste zle urobenu hierarchiu.

Ak ma niekto zaujem do kodu pozriet, velmi rad hodim niekam na web spakovany cely kod. Bolo mi potom mozno zaujimave to tu niekde vystavit ako zaciatocnicky kod a druha verzia po revizii skusenym clovekom. To by mohlo byt velmi poucne.

BTW: niesom koder profik, studujem chemiu, cize nemam dobry MVP background, toto chcem riesit zapochodu ako vsetko doteraz. Najlepsia cesta ako sa naucit je to skusat, dlhosiahle citanie teorie mi moc nesedi

Diky