Odhlášení cizího uživatele

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

Ahoj, řeším teď následující věc. Poměrně jednoduchý cms s frontendem a adminem, v adminovi je možnost ve správě uživatelů každého uživatele smazat, zabanovat atd.

Jde mi o to, že pokud bude uživatel zrovna přihlášen a někdo mu v adminovu udělí např. ban, chtěl bych ho odhlásit, protože dokud by se neodhlásil, mohl by se v systému dále pohybovat. Je nějaká možnost jak můžu identifikovat jeho session a zrušit ji?

22
Člen | 1478
+
0
-

A proč nekontroluješ při requestu, jestli nemá user BAN? :-)

Andrasin
Člen | 29
+
0
-

Tak to mám udělané teď, ale rád bych to změnil právě tak jak jsem psal, nechci při každém requestu sahat do db pro údaje a kontrolovat je. Navíc bych musel kontrolovat další věci, např. pokud někdo uživateli během jeho přihlášení nezměnil jeho roli atd.

MartyIX
Člen | 217
+
0
-

Idea: http://stackoverflow.com/…ssion-in-php

Disclaimer: Nezkousel jsem to.

Grelek
Člen | 233
+
0
-

Já bych prostě před každým požadavkem na změnu/odebrání/přidání testoval, zda-li má uživatel ban, nebo ne. Řekl bych, že výběr jednoho údaje navíc, databázi nějak extra nezatíží =).

Aurielle
Člen | 1281
+
0
-

Specifikujme dotaz trochu jinak. Dejme tomu, že máme nějaký ACL systém a administrátor může uživatelům libovolně měnit jejich práva (pro zjednodušení roli). V momentě, kdy je uživatel přihlášen, jeho údaje jsou uloženy v identitě a admin mu změní roli, do odhlášení mu zůstávají stará práva. Jak řešit tohle? Načítat při každém requestu znovu uživatelovy údaje a porovnávat, jestli se nezměnily s identitou, mi nepřijde jako příliš vhodné řešení.

22
Člen | 1478
+
0
-

Co si uložit jeho session ID do DB a při změně tu session smazat. Jinak práva by se asi měly kontrolovat při každém requestu, ne?

Andrasin
Člen | 29
+
0
-

Nějak tak jsem to myslel. S tímhle jsem ale nikdy nepracoval, takže nevím jak na to…

Po přihlášení uživatele tedy získám session id předpokládám takhle

$this->getSession()->getId();

Jak pak mám tu session smazat?

voda
Člen | 561
+
0
-

Session bych nemazal, uživatel by se pak musel znovu přihlašovat. Ulož si někam do db jen timestamp poslední změny (ban, oprávnění) a při každém requestu zkontroluj nejdřív timestamp oproti poslednímu načtení (údaj v session) a podle toho načítej další data.

Panda
Člen | 569
+
0
-

MartyIX napsal(a):

Idea: http://stackoverflow.com/…ssion-in-php

Disclaimer: Nezkousel jsem to.

Metodu uvedenou v „nejlepší odpovědi“ v žádném případě nepoužívat! Pointa SESSION ID je, že je unikátní a nepředvídatelné. Pokud bych generoval session ID MD5kou z uživatelského jména, tak jediné co mi stačí na přihlášení na jiného uživatele je znát jeho uživatelského jména. A jistě nechcete dávat super práva každému, kdo umí zavolat md5('admin').

Nepomůže ani solení nebo jiné techniky, pak se totiž jen situace převede na session hijacking, při kterém identifikátor session zůstává stejný, což znamená že ukradení účtu je trvalé.

Osobně bych doporučil jako session storage používat databázi, ukládat si do ní i název uživatele a v případě modifikace uživatele označit všechny jeho sessions k reloadu oprávnění, při smazání session smazat.

22
Člen | 1478
+
0
-

@voda: o to mu právě jde, je mu jde o to, aby zabanovaný user/user s novými právy byl co nejdříve odtřižen.

@Andrasin: session by mela jit smazat jako jakýkoliv jiný soubor, tedy unlink()

MartyIX
Člen | 217
+
0
-

Panda napsal(a):

MartyIX napsal(a):

Idea: http://stackoverflow.com/…ssion-in-php

Disclaimer: Nezkousel jsem to.

Metodu uvedenou v „nejlepší odpovědi“ v žádném případě nepoužívat! Pointa SESSION ID je, že je unikátní a nepředvídatelné. Pokud bych generoval session ID MD5kou z uživatelského jména, tak jediné co mi stačí na přihlášení na jiného uživatele je znát jeho uživatelského jména. A jistě nechcete dávat super práva každému, kdo umí zavolat md5('admin').

Nepomůže ani solení nebo jiné techniky, pak se totiž jen situace převede na session hijacking, při kterém identifikátor session zůstává stejný, což znamená že ukradení účtu je trvalé.

Co uložit pokazde unikatni identifikator uzivatelovy session do DB po prihlaseni?

Andrasin
Člen | 29
+
0
-

ano tak nakonec jsem to vyřešil tak, že po přihlášení uživatele se uloží jeho session id do databáze a například po udělení banu kontroluji, jestli session s id, které je v databáti existuje, pokud ano, smažu ji.

besir
Člen | 170
+
0
-

Andrasin napsal(a):

ano tak nakonec jsem to vyřešil tak, že po přihlášení uživatele se uloží jeho session id do databáze a například po udělení banu kontroluji, jestli session s id, které je v databáti existuje, pokud ano, smažu ji.

Sic trochu s křížkem po funuse, ale nebylo by lepší se prostě předpokládaný sessionID pokusit smazat a ověřovat zda se povedlo (eventuelně počet ovlivněných řádků) a až potom řešit neúspěch, než jí kontrolovat jestli je a v případě existence jí smazat…

Badaboom
Člen | 33
+
0
-

Teoreticky

Do storage si uložím čas, kdy se mají obnovit role, do session pak čas aktualizace role. Při každém požadavku zkontroluji, jestli se mají role obnovit.

Při změně práv by se pochopitelně uložil čas změny.

Nevýhody
+1 dotaz na storage
Byla by třeba aktivita uživatele ? Otravování více uživatelů : Výhoda++
Teorie

Výhody
Dotaz můžu spojit např. s načítáním nastavení
Cachování jediné hodnoty