Po přepnutí se na jiné view (stránku) se uživatel odhlásí

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

Omlouvám se, že v poslední době moc otravuju. Už jsem si myslel, že nette začínám pomalu rozumět, ale narazil jsem na problém. když se přihlásím jako uživatel a přejdu po přihlášení třeba na hlavní stránku webu, tak se uživatel odhlásí. Ikdyž se pak vrátím zpět na přihlašovácí stránku a dám F5 tak uživatel příhlášen již není.
Vypadá to jako by proměnná $user byla pouze lokální (a to jsem myslel že ji mám jako globální)

v Base presenteru jsem si deklaroval proměnnou user

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected $user;

...

V HomePagePresenteru mam funkci která zprácovává přihlašovací údaje

...
    public function signInFormSubmitted(UI\Form $form)
    {
        $values = $form->getValues();
        $nick = $values->nick;
        $password = $values->password;
        $this->user = $this->getUser();
        $this->user->setExpiration('30 minutes', TRUE);
        try{
            $this->user->login($nick, $password);
            $this->flashMessage("prihlasen");
        }
        catch(Nette\Security\AuthenticationException $e){
            if($e->getMessage() == "Invalid password."){
                $this->flashMessage("Špatné heslo.");
            }
            else if($e->getMessage() == "User not found."){
                $this->flashMessage("Uživatel neexistuje.");
            }
        }
    }
..
Pavel Macháň
Člen | 282
+
0
-

ondrakrajcik napsal(a):

Omlouvám se, že v poslední době moc otravuju. Už jsem si myslel, že nette začínám pomalu rozumět, ale narazil jsem na problém. když se přihlásím jako uživatel a přejdu po přihlášení třeba na hlavní stránku webu, tak se uživatel odhlásí. Ikdyž se pak vrátím zpět na přihlašovácí stránku a dám F5 tak uživatel příhlášen již není.
Vypadá to jako by proměnná $user byla pouze lokální (a to jsem myslel že ji mám jako globální)

v Base presenteru jsem si deklaroval proměnnou user

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
    protected $user;

...

V HomePagePresenteru mam funkci která zprácovává přihlašovací údaje

...
    public function signInFormSubmitted(UI\Form $form)
    {
        $values = $form->getValues();
        $nick = $values->nick;
        $password = $values->password;
        $this->user = $this->getUser();
        $this->user->setExpiration('30 minutes', TRUE);
        try{
            $this->user->login($nick, $password);
            $this->flashMessage("prihlasen");
        }
        catch(Nette\Security\AuthenticationException $e){
            if($e->getMessage() == "Invalid password."){
                $this->flashMessage("Špatné heslo.");
            }
            else if($e->getMessage() == "User not found."){
                $this->flashMessage("Uživatel neexistuje.");
            }
        }
    }
..

Proč máš v BasePresenteru toto?

protected $user;

a toto?

$this->user = $this->getUser();

Nette\Application\UI\Presenter již obsahuje usera

	/** @var Nette\Security\User */
	private $user;

Takže to tam nedávej znova a hlavně nechápu proč děláš defakto $this->user = $this->user

Z BasePresenteru odstraň tu tvoji proměnou $user a ve formuláři používej normálně $this->user->login (sice je $user private ale UI\Presenter ma v predkoj Nette\Object takze tento zapis normalne pujde)

A formulář bude

public function signInFormSubmitted(UI\Form $form)
{
    $values = $form->getValues();
    $nick = $values->nick;
    $password = $values->password;
    //$this->user = $this->getUser(); // Todle smaz ( provadis zde $this->user = $this->user)
    $this->user->setExpiration('30 minutes', TRUE);
    try{
        $this->user->login($nick, $password);
        $this->flashMessage("prihlasen");
    }
    catch(Nette\Security\AuthenticationException $e){
        if($e->getMessage() == "Invalid password."){
            $this->flashMessage("Špatné heslo.");
        }
        else if($e->getMessage() == "User not found."){
            $this->flashMessage("Uživatel neexistuje.");
        }
    }
}

Editoval EIFEL (8. 2. 2014 14:55)

ondrakrajcik
Člen | 45
+
0
-

I přesto problém přetrvává. Proto jsem to udělal tak, že jsem zkoušel uložit proměnou do baseresenteru, jeslti to nebude tak nahodou fungovat, ale stejně to nefungovalo. Nevím si rady.
Poradí někdo?

Editoval ondrakrajcik (8. 2. 2014 21:52)

ondrakrajcik
Člen | 45
+
0
-

Vyzkoušel jsem snad už všechno možné, ale pořád to nefunguje. To jsem sám, kdo kdy měl takový problém? Zkoušel jsem nastavovaní expirace (různé varianty), ale nepomohlo to. Po přejítí na hlavní (nebo jakoukoliv jinou) stránku, se uživatel sám odhlásí. Není opravdu potřeba ji uložit do nějaké globální proměnné?

Pavel Macháň
Člen | 282
+
0
-

ondrakrajcik napsal(a):

Vyzkoušel jsem snad už všechno možné, ale pořád to nefunguje. To jsem sám, kdo kdy měl takový problém? Zkoušel jsem nastavovaní expirace (různé varianty), ale nepomohlo to. Po přejítí na hlavní (nebo jakoukoliv jinou) stránku, se uživatel sám odhlásí. Není opravdu potřeba ji uložit do nějaké globální proměnné?

Nemáš v base presenteru nebo někde jinde odhlášení? Btw koukni se jestli se po každém refreshi nevytváří nové session atd.

ondrakrajcik
Člen | 45
+
0
-

V SignInPresenter jsem našel

	public function actionOut()
	{
		$this->getUser()->logout();
		$this->flashMessage('You have been signed out.');
		$this->redirect('in');
	}

ale zakomentování toho logoutu nepomohlo. Jinak nikde žádný logout nemám.

Ale teď jsem si všiml v debug baru (jeslti to správně říkám), že když najedu kurzorem na toho panáčka, tak vyskočí tabulka, v hlavičce má napsané „Unlogged“ a obsahuje informace o uživateli, který se přihlásil.

Nette\Security\Identity #8e95
id private => 10
roles private => array ()
data private => array (16)
name => "ondra" (7)
surname => "ondra" (9)
nick => "mujnick" (6)
password => "123" (8)
email => "neco@seznam.cz" (19)
phone => "123456789" (9)
country => "kraj" (9)
city => "mesto" (14)
psc => "12345" (5)
active => "no" (2)
credit => 129
ads => 15
time => "1374051472" (10)
code => "78152" (5)
ip => ""
id => 10

Když přejdu na hlavní stránku, tak tyto informace zůstanou nezměněné

Editoval ondrakrajcik (9. 2. 2014 10:48)

Pavel Macháň
Člen | 282
+
0
-

ondrakrajcik napsal(a):

V SignInPresenter jsem našel

	public function actionOut() {
		$this->getUser()->logout();
		......
	}

ale zakomentování toho logoutu nepomohlo. Jinak nikde žádný logout nemám.

Ale teď jsem si všiml v debug baru (jeslti to správně říkám), že když najedu kurzorem na toho panáčka, tak vyskočí tabulka, v hlavičce má napsané „Unlogged“ a obsahuje informace o uživateli, který se přihlásil.

Nette\Security\Identity #8e95
......
id => 10

Když přejdu na hlavní stránku, tak tyto informace zůstanou nezměněné

Takhle se nette chová pokud byl uživatel přihlášený a po odhlášení se nevymaze identita uzivatele (slouzi to ke sledovani navstevnika i po odhlaseni abys vedel kdo to byl)… Pokud dáě $this->user->logout(TRUE); tak se uživatel odlásí a smaže se i jeho identita.

Používáš vtomto projektu subdomény? (defaultni nastaveni je pouze pro aktualni domenu kde se prihlasujes) Když bys měl třeba přihlášování www.domena.tld/sign/in a po přihlášení si směroval na admin.domena.tld tak o přihlášení přijdeš (ale nevím jestli by nezařvala i identita)

BTW ten actionOut je OK tam to odhlášení logicky být má.

Editoval EIFEL (9. 2. 2014 12:19)

ondrakrajcik
Člen | 45
+
0
-

Zkusil jsem smazat identitu pomocí $this->user->logout(TRUE)
v debugger baru se poté objevilo: „Unlogged no identity“
Pak jsem se znovu přihlásil a opět uplně stejné nežádané chování. Žádná změna.

Co se subdomén týče, tak jsem si na serveru vytvořil zkušební adresář kde to testuju.

http://mojeadresa.cz/…prihlasit-se

Po úspěšném přihlášení přejdu na hlavní stranu, tj.

http://mojeadresa.cz/…eProjekt/www

A chová se to jako bych přihlášený nebyl. Ani po návratu na stránku s přihlášením

http://mojeadresa.cz/…prihlasit-se

se to chová jako bych přihlášený nebyl, ale v debugger baru po kliknutí na panáčka se vypíše opět v hlavičce „Unlogged“

Nette\Security\Identity #8e95
id private => 10
roles private => array ()
data private => array (16)
name => "ondra" (7)
surname => "ondra" (9)
nick => "mujnick" (6)
password => "123" (8)
email => "neco@seznam.cz" (19)
phone => "123456789" (9)
country => "kraj" (9)
city => "mesto" (14)
psc => "12345" (5)
active => "no" (2)
credit => 129
ads => 15
time => "1374051472" (10)
code => "78152" (5)
ip => ""
id => 10

Může to být tím, že projekt nemám přímo v kořenovém adresáři ale ve složce „Zkušební/netteProjekt“ ?

Pavel Macháň
Člen | 282
+
0
-

ondrakrajcik napsal(a):

Zkusil jsem smazat identitu pomocí $this->user->logout(TRUE)
v debugger baru se poté objevilo: „Unlogged no identity“
Pak jsem se znovu přihlásil a opět uplně stejné nežádané chování. Žádná změna.

Co se subdomén týče, tak jsem si na serveru vytvořil zkušební adresář kde to testuju.

http://mojeadresa.cz/…prihlasit-se

Po úspěšném přihlášení přejdu na hlavní stranu, tj.

http://mojeadresa.cz/…eProjekt/www

A chová se to jako bych přihlášený nebyl. Ani po návratu na stránku s přihlášením

http://mojeadresa.cz/…prihlasit-se

se to chová jako bych přihlášený nebyl, ale v debugger baru po kliknutí na panáčka se vypíše opět v hlavičce „Unlogged“

Nette\Security\Identity #8e95
id private => 10
roles private => array ()
data private => array (16)
name => "ondra" (7)
surname => "ondra" (9)
nick => "mujnick" (6)
password => "123" (8)
email => "neco@seznam.cz" (19)
phone => "123456789" (9)
country => "kraj" (9)
city => "mesto" (14)
psc => "12345" (5)
active => "no" (2)
credit => 129
ads => 15
time => "1374051472" (10)
code => "78152" (5)
ip => ""
id => 10

Může to být tím, že projekt nemám přímo v kořenovém adresáři ale ve složce „Zkušební/netteProjekt“ ?

To nevadí takhle to platí pro celou mojeadresa.cz (pokud bys tam mel vic nette projektu tak by nastal problem kvuli stejnemu prihlasovani… prihlasil bys to v jednom a vdruhem bys byl taky prihlasenej i kdyby to melo jine ucty)

BTW zapni si session debug bar a koukej se co se stim děje během redirectu

nette:
	session:
		debugger: on

Editoval EIFEL (9. 2. 2014 14:21)

ondrakrajcik
Člen | 45
+
0
-

Session debug bar jsem zapnul, po přihlášení se do session uživatel načte, když přejdu na jinou stránku tak se v session nic nemění, ale něco co mně zarazilo jsem přece jen našel

array (1)
"Nette.Http.UserStorage/" => array (3)
authenticated => FALSE  // TENTO ŘÁDEK MĚ ZARAZIL!!!!!
identity => Nette\Security\Identity #2873
id private => 11
roles private => array (1)
0 => "member" (6)
data private => array (16)
reason => 1

Nemělo by být na řádku kde je „authenticated ⇒ FALSE " místo "FALSE“ „TRUE“ ?
Co to může způsobovat?

ondrakrajcik
Člen | 45
+
0
-

Tak jsem zkusil založit nový projekt a vyzkoušel jsem přihlašování tam. Bez problémů funguje. Tak si podle tohoto funkčního projektu zkusím najít chybu. Pak přiložím řešení zda na to příjdu

Pavel Macháň
Člen | 282
+
0
-

ondrakrajcik napsal(a):

Tak jsem zkusil založit nový projekt a vyzkoušel jsem přihlašování tam. Bez problémů funguje. Tak si podle tohoto funkčního projektu zkusím najít chybu. Pak přiložím řešení zda na to příjdu

Určitě to bude nějaká blbost :) nebo zapomenutej kus kódu ;-)
Takhle se blbě hledá chyba, když nevidíme zdrojáky. Nenapadá mě čím by to mohlo být.