Nefunguje přihlášení – Identity nepřežije obnovení stránky

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

Zdravím,

mám problém s přihlášením.

Na úvod – používám nejnovější verzi nette z gitu na php 5.3.8

Popis problému:
Ve formuláři /sign/in se přihlásím, je redirect na homepage:default, kde v šabloně přes $user->isLoggedIn() kontroluju, zda je přihlášený, nebo ne.

<?php
{if $user->isLoggedIn()}
LOGGGED<br />
<a href="{link Sign:out}">Odhlášení</a>
{else}
NOT LOGGED<br />
<a href="{link Sign:in}">Přihlášení</a>
{/if}
?>

Při přihlášení a redirectu je uživatel přihlášený, ale při obnovení stránky třeba znovu zadáním v prohlížeči je uživatel najednou odhlášený …

Problém jsem vystopoval až k tomuto kousku kódu v session.php:

<?php
		// process meta metadata
		if (isset($nf['META'])) {
			$now = time();
			// expire section variables
			foreach ($nf['META'] as $section => $metadata) {
				if (is_array($metadata)) {
					foreach ($metadata as $variable => $value) {
						if ((!empty($value['B']) && $browserClosed) || (!empty($value['T']) && $now > $value['T']) // whenBrowserIsClosed || Time
							|| ($variable !== '' && is_object($nf['DATA'][$section][$variable]) && (isset($value['V']) ? $value['V'] : NULL) // Version
								!== Nette\Reflection\ClassType::from($nf['DATA'][$section][$variable])->getAnnotation('serializationVersion'))
						) {
							if ($variable === '') { // expire whole section
								unset($nf['META'][$section], $nf['DATA'][$section]);
								continue 2;
							}
							unset($nf['META'][$section][$variable], $nf['DATA'][$section][$variable]);
						}
					}
				}
			}
		}
?>

kokrétně část podmínky:
(isset($value['V']) ? $value['V'] : NULL) !== Nette\Reflection\ClassType::from($nf['DATA'][$section][$variable])->getAnnotation('serializationVersion')

Narazil někdo na stejný problém?

Jak toto vyřešit?

SignPresenter je ze sandboxu

UsersModel je pro test zjednodušený:

<?php
public function authenticate(array $credentials) {
	list($username, $password) = $credentials;

	if( ($username == 'user') && ($password == 'user') ){
            return new NS\Identity('1', 'admin', array('id'=>1, 'username'=>'user', 'name'=>'jmeno'));
	} else {
            throw new NS\AuthenticationException("Invalid password.", self::INVALID_CREDENTIAL);
	}
}
?>

PS: zkoušel jsem to na serveru, dvou VPS a na localhostu .. všude stejný výsledek …

Díky za pomoc

Filip Procházka
Moderator | 4668
+
0
-

Aktualizuj si Nette.

Tohle bude určitě nějaká hloupá chyba :) Zkus to na čistém sandboxu.

kucix
Člen | 33
+
0
-

Používám nejnovější verzi přímo z GITu :-)

Filip Procházka
Moderator | 4668
+
0
-

A zkusil jsi to na čistém sandboxu?

Mikulas Dite
Člen | 756
+
0
-

Zkontroloval bych session, jestli to třeba má nicotný expire nebo se resetuje při každém requestu, nebude to fungovat.

kucix
Člen | 33
+
0
-

expire je 30 minut, nebo 14 dní … každopádně by měla vydržet v řádu sekund/minut :-)

Ale je to ještě zajímavější …

Když mám Debugger::enable(Debugger::DEVELOPMENT); tak to dělá tyto vylomeniny

Ale když nastavím Debugger::enable(Debugger::PRODUCTION);, tak to najednou funguje a přihlášení si to udrží …

Jak může mít devel/production vliv na přihlášení?

Nemůžu si nastavit production, když chci teprve programovat stránky …

Já už nechápu nic :-D

Setkal se s tím někdo?

Aearsis
Člen | 57
+
0
-

Já se s tím setkal, ale bude to asi mimo kontext, a vlastně mi to fungovalo opačně. Používal sem k NotORM jako cache session, v pořádku to fungovalo na development, ale v production to mělo stejné následky jako u Tebe – jakákoli informace v session se nedožila dalšího requestu…