Kde zjistím čas „automatického“ odhlášení uživatele?

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

Ahojte,
kde zjistím čas automatického odhlášení usera? Potřeboval bych to ajaxem brát, aby user veděl, kdy se to na serveru odhlásí při neaktivitě. V prohlížeči to javascriptem nemůžu odečítat, protože kdyby měl user otevřeny okna 2, tak to starší nebude mít aktuálnější info, když user otevřel další okno (a tím pádem zase oddálil logout time pro inactivity logout).
Díky
Pavel

Etch
Člen | 403
+
0
-

Tak mohl by sis ajaxem periodicky kontrolovat čas poslední akce a daný čas si vypočítat, je ovšem nutno zařídit, aby samotný ajax request neprodlužoval daný čas odhlášení.

Stejně tak by mělo jít čas při requestu uložit třeba do cookie a následně pomocí JS odečítat.

Editoval Etch (20. 12. 2014 20:29)

thirdknown
Člen | 26
+
0
-

Tak mohl by sis ajaxem periodicky kontrolovat čas poslední akce a daný čas si vypočítat, je ovšem nutno zařídit, aby samotný ajax request neprodlužoval daný čas odhlášení.
To dělám, action, která vyhazuje konečný unixtime pro ajax jsem hodil do presenteru, který NEdědí z presenteru kde probíhá $this->user->setExpiration($expiration, true);

Nakonec si hodnotu expirace přihlášení uživatele ukládám do session a každá akce (ne ajaxová) prodlouží čas odhlášení.
Ten čas jsem si předtím ukládal do $this->user->identity->neco, jenže i když ajaxová akce vždy vyhazovala stejnou expiraci přihlášení uživatele (i vypršelý unix timestamp), tak jsem vysledoval, že Nette zůstalo přihlášeno po skončení expirace přesně stejnou dobu, jako byla expirace!!! Dost jsem se natrápil, ale ukládání ne do identity ale do session pomohlo.

Stejně tak by mělo jít čas při requestu uložit třeba do cookie a následně pomocí JS odečítat.
To funguje, jenže když mám otevřené dvě okna, tak se třeba v chromu pomocí JS setInterval(...) nenatáhnou nové hodnoty cookies, i když ve vedlejším okně ty hodnoty už natáhnuty jsou plným znovunačtením stránky.

Etch
Člen | 403
+
0
-

Použit sandbox:

BasePresenter

public function startup(){
	parent::startup();
	if($this->user->loggedIn){
		$this->getHttpResponse()->setCookie('logouttime', time()+20, time()+100, null, null, null, false);
	}else{
		$this->getHttpResponse()->setCookie('logouttime', time()+20, -1);
	}
}

default.latte

{block content}
	<div id="foo"></div>
{/block}

main.js

<script>
$(function(){
	setInterval(function(){
		now = Date.now()/1000|0;
		logouttime = $.cookie('logouttime');
		if(isNaN(logouttime) || logouttime - now <= 0){
			text = 'Unlogged';
		}else{
			text = logouttime - now;
		}
		$('div#foo').text(text);
	}, 1000);
});
</script>

SignPresenter

	public function signInFormSucceeded($form, $values)
	{
		if ($values->remember) {
			$this->getUser()->setExpiration('14 days', FALSE);
		} else {
			$this->getUser()->setExpiration('20 seconds', TRUE);
		}

		try {
			$this->getUser()->login($values->username, $values->password);
			$this->redirect('Homepage:');

		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError($e->getMessage());
		}
	}

EDIT: Zkoušeno v Chromu, Firefoxu a Safary na Mac OS.

Nutno brát pouze jako nástřel…

Editoval Etch (23. 12. 2014 1:41)