Změna dat uživatele vs. aktuální identita v session
- Blizzy
- Člen | 149
V administraci CMS mám správu uživatelů, kde můžu měnit různé nastavení pro uživatele. Pokud některého uživatele změním, změny se u něj se projeví až když se ten uživatel odhlasí a znovu přihlasí (protože jeho stará data jsou uložena v jeho session jako identita).
Jak ošetřit to, že když některého uživatele změním, tak by byl ten uživatel odhlášen (resp. všechny jeho session invalidovat)? Nebo dělá se to normálně v praxi nějak jinak? (Nikdy jsem nic podobného neřešil.)
Alternativou by taky bylo při každé akci uživatele ověřit, jestli je identita v session shodná s daty uživatele v databázi nebo rovnou vždy aktualizovat identitu, ale to se mi zdá špatný postup.
- Patrik Votoček
- Člen | 2221
Já mám pro tyto případy v CMSku super tlačítko odhlásit všechny uživatele. A jak je to řešeno technicky? Mám v DB u uživatelů flag status (on-line, off-line, banned) a ten po každém kliknutí usera ověřuju (taky si tam ukládám last click – abych mel skutecne prehled o tom kdo je on-line – cronem odhlasuju). Toď mé řešení.
- nAS
- Člen | 277
Takže to ale znamená, že při každém požadavku hledáš data uživatele v databázi. V tom případě můžeš danou identitu rovnou aktualizovat. Problém je v tom, že v naprosté většině případů je to zátěž, která je k ničemu. Ale nenapadá mě, jak to udělat lépe – sám jsem přesně tento problém řešil před dvěma dny a zatím jsem to nechal být.
- vlki
- Člen | 218
Musím říct, že mě ani jiné řešení, než to, které navrhl vrtak-cz nenapadá.
Možná, kdyby šlo nastavit validitu session v závislosti na nějakém souboru nebo tagu, který by existoval globálně pro všechny sessions, tak by ho šlo jednoduše invalidovat.
Takové řešení by ale získávání session docela zpomalilo, protože by bylo potřeba jít na disk. Nebo do databáze, ale to už by nemohly sessions dělat automaticky. Kdyby šlo nastavit v závislostech konkrétního session namespace nějaký callback, který by ověřoval validitu? Programátor by si tam pak napsal např. rychlý dotaz na db.
Třeba to zařadit do rozhraní IAuthenticator
vedle
authenticate
, což? Něco jako isSessionValid
.
Nebo to jde i jednodušejí?:)
- nAS
- Člen | 277
Já mám ve svých aplikacích vždy nějaké dynamické nastavení, které načítám při každém požadavku. Je to jednoduché pole a načtu jej jedním dotazem z databáze. A když jsem přemýšlel nad tímto problémem, tak nejlepší co mě napadlo, bylo mít v nastavení nějaké počítadlo a při přihlášení uložit toto počítadlo do Identity. A při každém požadavku porovnat číslo z Identity s číslem v nastavení. Pokud se neshodují, tak obnovím data z databáze do Identity. Potom mi při změně libovolného údaje zvýšit toto počítadlo a všichi zrovna přihlášení uživatelé si načtou aktuální údaje.
Má to výhodu, že při běžném načtení stránky nepotřebuji žádný další přístup na disk, nebo do databáze, ale je potřeba načítat právě ono nastavení.
Bez jakéhokoliv přístupu se to ale řešit nedá, takže toto vypadá na poměrně schůdné řešení.
- Ondřej Mirtes
- Člen | 1536
Teď jsem také narazil na problém, že potřebuji aktualizovat údaje v Identity. Koukám do API – a ty údaje mají i setter! Takže IMHO není problém při každé změně nějakého údaje v Identity zavolat jeho setter a přenastavit si ho…