Odhlášení cizího uživatele
- Harrier
- Člen | 9
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 | 661
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
doporucuji do identity ukladat pouze id uzivatele a dalsi data tahat vzdy pri kazdem requestu
- Harrier
- Člen | 9
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.