Odhlášení cizího uživatele

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

Už se to tu několikrát řešilo, pro připomenutí:
Změním roli/zabanuju účet a potřebuju uživatele odhlásit/relognout než napáchá škodu.

Došlo se ke dvoum řešením:

  • Uložit session ID do DB po přihlášení a unlink() pro odhlášení (smaže i uživ. nastavení uživateli který se má jen relognout)
  • Při každém requestu dotaz do DB (zbytečné?)

Napadlo mě další řešení:

$usersessid = "2q0824i123tjl7fej1gb7ljmv3"; //uživatel kterého chceme odhlásit

$mysessdata = session_encode();
$usersessdata = file_get_contents("../temp/sessions/sess_".$usersessid);
session_decode($usersessdata);
unset($_SESSION["Nette.Http.UserStorage/"]);
$usersessdata = session_encode();
file_put_contents("../temp/sessions/sess_".$usersessid,$usersessdata);
session_decode($mysessdata);

Kód jsem ješte nezkoušel, bude to fungovat? Není to moc velká prasárna? Díky

Editoval Harrier (16. 1. 2017 16:59)

Martk
Člen | 655
+
0
-

Proč chceš odhlašovat cizího uživatele? Teoreticky by měl fungovat ten kód, ale tady tento je podle mě lepší:

$storePrevId = session_id();

session_id($usersessid); // zcizene session
unset($_SESSION["Nette.Http.UserStorage/"]);

session_id($storePrevId); // navraceni praveho session

Ten dotaz nemusíš dělat při každém requestu, ale např. co 60 minut.

Editoval Martk (16. 1. 2017 23:06)

David Matějka
Moderator | 6445
+
0
-

doporucuji do identity ukladat pouze id uzivatele a dalsi data tahat vzdy pri kazdem requestu

Harrier
Člen | 9
+
0
-

Martk napsal(a):

Proč chceš odhlašovat cizího uživatele? Teoreticky by měl fungovat ten kód, ale tady tento je podle mě lepší:

$storePrevId = session_id();

session_id($usersessid); // zcizene session
unset($_SESSION["Nette.Http.UserStorage/"]);

session_id($storePrevId); // navraceni praveho session

Ten dotaz nemusíš dělat při každém requestu, ale např. co 60 minut.

Psal jsem to nahoře, když někomu cizímu změnim roli/zabanuju ho tak ho potřebuju ihned odhlásit. 60 minut čekat je risk.

Díval jsem se na session_id() a z php.net:
If id is specified, it will replace the current session id. session_id() needs to be called before session_start() for that purpose.

Note: When using session cookies, specifying an id for session_id() will always send a new cookie when session_start() is called, regardless if the current session id is identical to the one being set.

Kdyby to někde skončilo chybou ještě před obnovením původní session tak hrozí převzetí cizí identity.
Nadruhou stranu file_put_contents() může skončit chybou pokud je zrovna ten uživatel online? Nejsem si jistý jak je to s právama na linuxu, ale na windows mě to nenechá ani unlinknout soubor když je vlastník té session online.