Kde zjistím čas „automatického“ odhlášení uživatele?
- thirdknown
- Člen | 26
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
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
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
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)