Nechtěné „na oko“ odhlášení uživatele po kliku na položku domů

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

Dobrý den,

děje se mi problém s odhlašováním uživatelů chtěl bych se zeptat zda se někomu neděje něco podobného.

Na začátku je nutno říci, že aplikace běží na ne Nette 2.2.2 a na localhostu běží bez jediného problému. Problém nastal až po nahrání aplikace na hosting muj.cesky-hosting.cz , kde je zakázaná funkce ini_set(). Házelo to error, ale pomocí strejdy googla jsem objevil starší vlákno zde na fóru a dle rad toho fóra jsem do configu.neon přidal a bláhově doufal, že už bude vše ok.

	session:
		autoStart: smart
		expiration: 14 days
		gc_maxlifetime: null

Je pravda, že se web už rozjel (do té doby se zobrazovalo jen chybové hlášení), ale pořád to není stoprocentní. Nyní se uživatel přihlásí a pomocí metody $user->loggedIn ošetřím zda je uživatel přihlášen a pokud ano, tak vypíši jeho nickname. Pro všechny odkazy to funguje, ale jakmile uživatel klikne na odkaz „Domů“ (Presenter:Default), tak ho to „na oko“ odhlásí (nickname se skryje a nabídne mu to link na přihlášení). Pokud uživatel v tomto okamžiku refreshne prohlížeč, tak se zobrazí jeho nick a uživatel je správně přihlášen. Chyba se tím i opraví a když se uživatel odhlásí a znovu přihlásí a opět klikne na „Domů“, tak už ho to „na oko“ neodhlašuje. Prostě po refreshi se vše opraví a systém běží bez problémů. Pokud uživatel v tu chvíli kdy se mu to jakoby odhlásí prohlížeč nerefreshne a klikne na nějaký link na webu, tak se mu nickname automaticky zase zobrazí, ale jakmile zase klikne na domů, tak se to zase „na oko odhlásí“. Chyba se tedy opakuje do té doby dokud uživatel na té položce domů nerefreshne prohlížeč.

Shrnutí:
Problém tedy nastává při úplně prvním přihlášení na webu. Na dobro to opraví refresh stránky. Dělají to opera, mozila, chrome. IE tuto chybu nedělá, ten funguje úplně bez problémů. Zvláštní je, že uživatele to neodhlásí, ale pouze metoda $user->loggedIn nevyhodnotí uživatele jako přihlášeného. Nicméně po refreshnutí stránky si ho konečně všimne. Řeším problém již pár dní a nevím co s tím, uvítám jakoukoliv radu k problému.

S pozdravem Roman Prchal

Editoval prcharom (2. 12. 2014 19:46)

japlavaren
Člen | 404
+
0
-

presmerovávaš po prihlásení? užívateľ odošle prihlasovací form, autentizuješ ho a presmerovávaš, alebo nie?

prcharom
Člen | 28
+
0
-

Ano přesně tak. Pro přehled posílám kód pro zpracování odeslaného login formu.

// metoda pro zpracovani odeslaneho prihlasovaciho formulare
public function loginFormSucceeded($form, $values)
{
	try {
        $this->getUser()->login($values->nick, $values->heslo);
        $uzivatel = $this->database->findById('uzivatel', $this->user->id);
        if($uzivatel->prvni_prihlaseni == null)
        {
            // uloz presny datum a cas prvniho prihlaseni uzivatele
            $data['prvni_prihlaseni'] = date('Y-m-d H:i:s');
            $uzivatel->update($data);
        }
        $this->flashMessage('Přihlášení proběhlo úspěšně.');
        $this->redirect('Homepage:default');
    } catch (Nette\Security\AuthenticationException $e) {
        $form->addError($e->getMessage());
	   	}
}
Michalek
Člen | 211
+
0
-

Nemohlo by to souviset s www / bez www?

petr.pavel
Člen | 535
+
+1
-

uživatele to neodhlásí, ale pouze metoda $user->loggedIn nevyhodnotí uživatele jako přihlášeného

Jak jsi k tomu dospěl? $user->isLoggedIn() vrací $session && $session->authenticated, takže tam moc prostoru pro chybu není :-) Díval ses přímo do adresáře se session na uložené hodnoty? Nebo sis dumpoval obsah session před voláním $user->loggedIn?

Taky mě mate, že se chyba neprojevuje v IE, ale v ostatních prohlížečích ano. To mi přijde přinejmenším nepravděpodobné. Kdyby byl problém v session cookie, tak se projeví ve všech prohlížečích a nespraví se při refreši.

Kdysi jsem řešil záhadné odhlašování, které ovšem bylo trvalé. Šlo o to, že obrázek na stránce vracel 500 a ta v Nette způsobila odhlášení uživatele. Kdyby to ve tvém případě dělal nějaký nalinkovaný soubor, tak by ale musel jiný nalinkovaný soubor uživatele zase přihlásit (bez skutečné autentizace), což je ehm… přinejmenším nepravděpodobné :-) Třeba tě to ale k něčemu inspiruje.

prcharom
Člen | 28
+
0
-

Teď úplně nevím co máš přesně na mysli. Nicméně já osobně tipuji, že bude problém někde v tom routu, když se defaultně načítá stránka po zadání adresy až po www. Načte se index.php, který spustí Nette šamanství a výsledkem je můj Homepage:default. Když tedy jsem na Homepage:default, tak se mi v url vůbec nezobrazí mojedomena.cz/www/Nazev_presenteru/Nazev_akce/ jako tomu je u ostatních odkazů, ale zobrazi se mojedomena.cz/www/. Myslím si, že chyba bude někde tady, že prostě odsud ten prohlížeč nevidí sesion. Vím je to hodně laická úvaha, ale nic jiného mě nenapadá a jak to vyřešit už tuplem ne.

Editoval prcharom (4. 12. 2014 22:57)

prcharom
Člen | 28
+
0
-

Jasné děkuji za dovysvětlení, no spíš si myslím, zda není problém někde v routu. Že tu session prostě z mojedomena.cz/www/ nevidí, protože to dělá u mé domovské stránky a to je jediná stránka, která se nezobrazuje stylem mojedomena.cz/www/Nazev_presenteru/Nazev_akce/. I adresa obrázků je zde jiná, je třeba jít o 1 adresář navíc níže tuším. Nejsem si úplně jist jakým stylem se sessions ukládají.

Editoval prcharom (5. 12. 2014 11:56)

petr.pavel
Člen | 535
+
0
-

Kdyby session cookie platila pouze pro „aktuální adresář“ (tj. konkrétní presenter/akci), tak by se ti session nepřenášela ani mezi presentery/akcemi. Nejen mezi domovskou stránkou a ostatními presentery.

Můžu ti jen poradit buď si nastavit breakpoint do User->isLoggedIn() a odkrokovat si, co se tam děje. Používat pořádné IDE s debuggerem se vyplatí na mnoha rovinách. Pokud z nějakého důvodu nemůžeš, tak holt přes klasické „dump();“ přijít na to, co kde je a není. Neboj se takhle procházet a měnit zdrojáky Nette. Pochopíš, co k čemu slouží a to je dobrá investice. Jen nakonec nezapomeň vrátit změny zpátky ;-)

Mimochodem (nesouvisí s přihlašováním), máš nějaký důvod, proč mít v url to „www“? Pravděpodobně's nahrál všechno do public_html, místo toho, abys do něj nahrál jen obsah „www“. Jestli máš přístup pouze do www, tak prohledej fórum, řešilo se to tady mnohokrát.

petr.pavel
Člen | 535
+
0
-

Ještě mě napadlo prohledat zdrojáky Nette na funkci ini_set(). Používá se opravdu hojně, takže mě docela překvapuje, že ti to vůbec jede. Zvaž, jestli ti opravdu stojí za to vyhazovat čas (zákazníkovy peníze) na trápení s blbým hostingem, když je kolem tolik jiných možností.

Je také možné, že na hostingu je zakázané ještě něco dalšího, co třeba nějak ovlivňuje regenerování hodnoty session id. Nette za určitých okolností vygeneruje novou hodnotu a třeba se to nějak neuloží do cookiny.

Najdi si, do jakého adresáře se na hostingu ukládají soubory se session a sleduj, co se tam děje.

prcharom
Člen | 28
+
0
-

Děkuji za cenné rady, vezmu si je k srdci a budu zkoušet. Jinak ještě to www je jen pozůstatek sandboxu, jen jsem to 1:1 nahrál na hosting. Hlubší smysl to nemá.

Editoval prcharom (5. 12. 2014 11:59)