„Prihlásený“ neprihlásený užívateľ

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

Dobry den.

Vsimol som si v Mozille jeden velmi zvlastny a hlavne podstatny problem, ktory musim unahlene riesit. Na stranke mam komponent, ktory zobrazuje prihlasovaci formular pre neprihlasenych uzivatelov a automaticky ked je prihlaseny, tak sa tam zobrazia informacie o prihlasenom uzivatelovi. To je vsetko v poriadku. No teraz vidim ze sa v systeme uzivatel javi ako neprihlaseny (zice mam hore znova prihlasovaci formular) no Nette debug panel hlasi prihlaseneho uzivatela. Taktiez mam pristup do editacie profilu daneho uzivatela. Kde moze byt chyba?? Stalo sa to uz niekomu?

Jedna uzivatelka mi uz hlasila aj podivny problem ze sa jej nedari prihlasit pomocou formulara cez Mozillu, co sa mi este nestalo. Nerozumiem tomu…

Dakujem za rady

Majkl578
Moderator | 1364
+
0
-

Nejsi náhodou nepřihlášený a nezůstala ti identita?

tolljump
Člen | 47
+
0
-

Praveze nie, pretoze ja som sa vobec neodhlasoval. Len som sa prihlasil bez zapamätania prihlasenia, co mam nastavene v session na expiraciu po 20 minutach. Po nejakej pol hodinke som sa vratil na stranku, zobrazuje ma ako odhlaseneho, ale pritom Identity ostalo zapisane a dostanem sa do editacie profilu napriklad. Co je obrovska bezpecnostna chyba…

enumag
Člen | 2118
+
0
-

To že identita zůstává je feature. Podle čeho provádíš kontrolu zda uživatel je přihlášen?

//správná kontrola
$user->isLoggedIn()
//chybná kontrola
$user->getIdentity() !== NULL
tolljump
Člen | 47
+
0
-

…pomocou isLoggedIn(). Ale v tomto pripade pomocou Authorizator-a a Permissions.
Cize touto funkciou:

public function actionProfile(){

		if(!$this->user->isAllowed('user','profile')){
			$this->flashMessage('Musíte sa prihlásiť, aby ste mohli upravovať svoj profil','error');
			$this->redirect('Homepage:');
		}
	}

Editoval tolljump (16. 2. 2013 15:47)

JakubTN
Bronze Partner | 49
+
0
-

No zjavne ti po odhlaseni ostava ulozena identita a tym padom je splnena tvoja podmienka. Ak nemas overovanie cez isLoggedIn() niekde na zaciatku celeho presenteru (metoda startup alebo nieco podobne) tak ho skus pridat do tej tvojej actionProfile

public function actionProfile(){

        if(!$this->user->isLoggedIn() || !$this->user->isAllowed('user','profile')){
            $this->flashMessage('Musíte sa prihlásiť, aby ste mohli upravovať svoj profil','error');
            $this->redirect('Homepage:');
        }
    }
enumag
Člen | 2118
+
0
-

To by nemělo být nutné. Při volání isAllowed se volá User::getRoles a ta si kontroluje zda je uživatel přihlášen. Pokud ne tak vrátí jen roli „guest“ a ne role té staré identity. Metoda isAllowed vrátí FALSE protože role guest by tyhle věci rozhodně neměla mít povolené (to už záleží na autorizátoru).

tolljump
Člen | 47
+
0
-

Tak potom naozaj nerozumiem, ze tento skript pusti „neprihlaseneho“ uzivatela k editacii profilu…

enumag
Člen | 2118
+
0
-

Ani já… bude to nějaká haluz. Nepoužíváš vlastní třídu User nebo Identity? Jak vypadá tvůj autorizátor?

To co navrhoval JakubTN ale vyzkoušej, pokud by to náhodou pomohlo tak bych docela rád věděl, kde je problém protože to může být i bug.

tolljump
Člen | 47
+
0
-

pridal som do kazdej podmienky este overenie isLoggedIn() a uz to funguje ako ma. Asi bude treba prepracovat authorizator, aby to bolo univerzalne vsade aj bez tejto podmienky.

enumag
Člen | 2118
+
0
-

Sahá tvůj autorizátor na identitu? Pokud v autorizátoru používáš $identity->getRoles() tak je problém jasný, měl bys použít $user->getRoles().

tolljump
Člen | 47
+
0
-

Nie nie, toto by malo byt v poriadku. V Authorizator pouzivam Nette\Security\Permission ako acl a tak vytvaram pomocou addRole(), addResource() a allow() rozne podmienky pre pristup uzivatelov.