seExpiration u login nefunguje

Damo
Člen | 54
+
0
-

Ahoj,

nastavená setExpiration u uživatele mi nefunguje, bere mi to tu vyšší nastavenou v neon

v neon 12 hodin

$user->setExpiration("30 minutes");

v setExpiration mam 30 minut,

ale když vypnu browser, PC, a vratím se za hodinu na web, tak jsem porad prihlasen.

Co může být špatně?

Marek Bartoš
Nette Blogger | 1167
+
+1
-

Expirace v neonu přidává call setExpiration() do vytvoření služby User. Takže pokaždé, když se vytvoří služba, expirace se ti přepíše.
Asi by se to dalo řešit tak, aby Nette setExpiration() call vložilo do callbacku onLoggedIn.
Případně expiraci v konfiguraci extension nepoužívej a přidej si vlastní config s časem expirace, který použiješ při přihlášení.

Editoval Marek Bartoš (24. 6. 2022 10:30)

Damo
Člen | 54
+
0
-

zkousím ten callback

$user->onLoggedIn[] = function() use ($user) {
	$user->setExpiration("10 minutes");
};

ale nefunguje to, prihlasni nevyexpiruje po 10 minutách

Edit: jsem zjistil, ze se onLoggedIn vůbec nevolá, zajímavé

Editoval Damo (24. 6. 2022 11:39)

Marek Bartoš
Nette Blogger | 1167
+
+1
-

Ten callback by muselo používat Nette, ne ty. Aby nastavovalo expiraci jen při přihlášení a ty jsi ji mohl přetížit ve svém kódu po přihlášení. Teď Nette expiraci nastavuje pokaždé, když se vytvoří služba User, tedy při každém requestu.

Že by se ti onLoggedIn callback nevolal vůbec je divné. Buď jsi se přehlédl nebo jsi ho nepřidal před zavoláním login()

Editoval Marek Bartoš (24. 6. 2022 11:45)

Damo
Člen | 54
+
0
-

Jaj, jsem to mel az po login, dal jsem pred, zkusil jsem to s 1minutou expirace a BINGO, funguje, byl jsem odhlasen :-)

Díky moc

David Grudl
Nette Core | 8129
+
0
-

Marek Bartoš napsal(a):

Expirace v neonu přidává call setExpiration() do vytvoření služby User.

Ne, nic takového se neděje.

@Damo setExpiration() je potřeba zavolat společně s login()

Damo
Člen | 54
+
0
-

David Grudl napsal(a):

Marek Bartoš napsal(a):

Expirace v neonu přidává call setExpiration() do vytvoření služby User.

Ne, nic takového se neděje.

@Damo setExpiration() je potřeba zavolat společně s login()

Právě tak jsem to měl a nefungovalo

takto:

    $user->setExpiration("30 minutes");
	$user->login($login, $password);

po uprave na toto, už to funguje

    $user->onLoggedIn[] = function() use ($user) {
		$user->setExpiration("30 minutes");
	};
	$user->login($login, $password);
David Grudl
Nette Core | 8129
+
0
-

Marek Bartoš napsal(a):

@DavidGrudl https://github.com/…xtension.php#…

Máš recht, je to tam … a chová se to špatně, opravím :-)

Marek Bartoš
Nette Blogger | 1167
+
0
-

Vysvětlím raději kódem.

@Damo Expiraci je třeba nastavit po přihlášení, ne před ním. Tím že jsi expiraci přesunul do eventu onLoggedIn, tak se volá po přihlášení. Bez eventu bys tedy napsal toto:

$user->login($login, $password);
$user->setExpiration("30 minutes");

Ten event sám o sobě je důležitý pouze na straně Nette. Když nastavíš toto:

security:
  authentication:
    expiration: 1 hour

tak se teď vygeneruje:

$service = new Nette\Security\User();
$service->setExpiration('1 hour');

Takže se tvá expirace při každém request přenastaví. Aby se tak nedělo a nastavení v neonu respektovalo, co voláš ve vlastním kódu, tak by Nette muselo generovat toto:

$service = new Nette\Security\User();
$service->onLoggedIn[] = function() use($service) {
  $service->setExpiration('1 hour');
}
Marek Bartoš
Nette Blogger | 1167
+
0
-

@DavidGrudl Díky

David Grudl
Nette Core | 8129
+
+2
-

Můžete zkusit @dev verzi, mělo by to fungovat už správně bez obezliček přes onLoggedIn.

Btw setExpiration() by mělo být volané před login()