Nechtěné „na oko“ odhlášení uživatele po kliku na položku domů
- prcharom
- Člen | 28
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
presmerovávaš po prihlásení? užívateľ odošle prihlasovací form, autentizuješ ho a presmerovávaš, alebo nie?
- prcharom
- Člen | 28
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());
}
}
- petr.pavel
- Člen | 535
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
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
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
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
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.