Temat: usuniecie uzytkownika i aktywna sesja...

hej,

mam nastepujacy problem - zalozmy ze w serwisie mamy dwoch uzytkownikow - przykladowo: jankowalski i doda.

jankowalski jest adminem, doda jest zwyklym uzytkownikiem, obydwoje sa zalogowani w serwisie tym samym czasie. jankowalski z panelu admina w aplikacji usuwa uzytkownika doda - jednak doda jest ciagle zalogowana i jej dane znajduja sie w sesji. jak automatycznie wylogowac dode po usunieciu tego uzytkownika?

zakladam, ze nie przechowuje sesji w bazie

chodzi mi o rozwiazanie pod CakePHP...

pozdrawiam
Grzegorz N.

Grzegorz N. trochę programuje...

Temat: usuniecie uzytkownika i aktywna sesja...

Witam.

Ja zazwyczaj jak już mam autoryzację w serwisie, to przy rozpoczęciu każdej sesji, w której user może być zalogowany, ładuje obiekt usera (czyli wczytuje go z bazy) - jak dla mnie załatwia to problem, bo w momencie kiedy nie mogę załadować usera - kasuje dane w tej sesji.

Do tego, żeby nie orać po bazie przy każdym kliknięciu w serwisie dane usera przechowywane są dodatkowo w cache-u (cache plikowy w zupełności wystarcza).

Pozdrawiam!

Temat: usuniecie uzytkownika i aktywna sesja...

nie no jasne, tez laduje dane usera z bazy przy autoryzacji do sesji - ale mi chodzi o sytuacje, kiedy usune uzytkownika ktory w tym samym momencie w czasie jest juz zalogowany... slowem chce aby go przy kolejnym requescie po usunieciu konta wylogowalo... :)

generalnie juz rozwiazalem ten problem, ale poczekam - moze cos ciekawego napiszecie :)Tomek Wieczorek edytował(a) ten post dnia 15.10.09 o godzinie 23:30
Grzegorz N.

Grzegorz N. trochę programuje...

Temat: usuniecie uzytkownika i aktywna sesja...

Myślę że to załatwia sprawę (a na pewno bardziej ilustruje co mam na myśli) ;-), powiedzmy że to pseudo-kod:

$user_id = $_SESSION['logged_user_id'];

$objUser = $jakisObiektDoLadowaniaUserow->wczytajUseraById($user_id);

//nie ma usera -> wyloguj
if (empty($objUser)){
logout();
}

Temat: usuniecie uzytkownika i aktywna sesja...

Grzegorz Nowicki:
Myślę że to załatwia sprawę (a na pewno bardziej ilustruje co mam na myśli) ;-), powiedzmy że to pseudo-kod:

$user_id = $_SESSION['logged_user_id'];

$objUser = $jakisObiektDoLadowaniaUserow->wczytajUseraById($user_id);

//nie ma usera -> wyloguj
if (empty($objUser)){
logout();
}

odwolanie do bazy przy kazdym requescie ? odpada...
Grzegorz N.

Grzegorz N. trochę programuje...

Temat: usuniecie uzytkownika i aktywna sesja...

Tomek Wieczorek:
Grzegorz Nowicki:
Myślę że to załatwia sprawę (a na pewno bardziej ilustruje co mam na myśli) ;-), powiedzmy że to pseudo-kod:

$user_id = $_SESSION['logged_user_id'];

$objUser = $jakisObiektDoLadowaniaUserow->wczytajUseraById($user_id);

//nie ma usera -> wyloguj
if (empty($objUser)){
logout();
}

odwolanie do bazy przy kazdym requescie ? odpada...

i po to właśnie stosuje się cache :-)

public function wczytajUseraById($user_id){
$cache = JakasKlasaOdCachea::getInstance();

if (!$user = $cache->load('user' . $user_id)){
$user = wczytaj_usera_z_bazy($user_id);
}

return $user;
}

Warunek żeby to dobrze działało jest taki, że każda operacja w bazie na userze musi być odwzorowana w cache-u - innymi słowy: cache musi być aktualny.

Polecam Zend_Cache: http://framework.zend.com/manual/en/zend.cache.html - ogólnie, filozofia działania - własną klasę do obsługi cache-owania można w 2h napisać... ;-)

Temat: usuniecie uzytkownika i aktywna sesja...

no cos w tym stylu... ja zrobilem to w ten sposob - przy kazdym usunieciu usera wrzucam do tablicy w cache (na razie plikowego ale to rownie dobrze moze byc obiekt memcache) id usera ktory zostal usuniety. sesja w mojej aplikacji trwa 20 minut wiec ustawilem waznosc cache`u na 25 min dla pewnosci :)
Grzegorz N.

Grzegorz N. trochę programuje...

Temat: usuniecie uzytkownika i aktywna sesja...

No i to jest dobre rozwiązanie.

Nie polecam do takich rzeczy memcache'a, bo jak masz duży ruch na memcache-u to obiekty nawzajem się z niego wypychają, nawet jeśli mają jeszcze czas expiracji w przyszłości...
No chyba że masz kilka www-ów, to już wtedy jakaś kolejka a'la memcacheq albo zwykły memcache (ale ze świadomością wypadania danych z niego).

Rozwiązań można pewnie jeszcze kilka innych wymyślić - ale jeśli działa Ci to jedno, proste - to ja bym przy tym pozostał. Lepiej klepać kolejne funkcjonalności niż tracić czas na zastanawianie się jakby to można było zrobić inaczej ;-) (zasada "K.I.S.S." rulezzz!!)

Pozdrawiam!
Grzegorz F.

Grzegorz F. Software Engineer -
Technical Architect

Temat: usuniecie uzytkownika i aktywna sesja...

Tomek Wieczorek:
no cos w tym stylu... ja zrobilem to w ten sposob - przy kazdym usunieciu usera wrzucam do tablicy w cache (na razie plikowego ale to rownie dobrze moze byc obiekt memcache) id usera ktory zostal usuniety. sesja w mojej aplikacji trwa 20 minut wiec ustawilem waznosc cache`u na 25 min dla pewnosci :)

nie polecam cache'a plikowego już bardziej baza np tabela typu MEMORY lub memcached ewentualnie apc w zależności co jest dostępne

konto usunięte

Temat: usuniecie uzytkownika i aktywna sesja...

Moze cos na bazie sprawdzonych rozwiazan typu PEAR::Auth?
http://pear.php.net/package/Auth/

Temat: usuniecie uzytkownika i aktywna sesja...

po co mi PEAR jak mam framework ktory ma wlasna autentykacje?
zreszta ten problem i tak wystepuje nawet jak uzywasz PEAR::Auth. To i tak jest tylko wrapper na obsluge sesji.
Marcin P.

Marcin P. Zakamuflowany
programista

Temat: usuniecie uzytkownika i aktywna sesja...

Tomek Wieczorek:

odwolanie do bazy przy kazdym requescie ? odpada...
Tyle że to standard w każdym większym serwisie...
Oczywiście nie koniecznie zawsze z bazy danych ale też z cache.
Wojciech K.

Wojciech K. realizator pomysłów
własnych

Temat: usuniecie uzytkownika i aktywna sesja...

Tomek Wieczorek:
jest ciagle zalogowana i jej dane znajduja sie w sesji. jak automatycznie wylogowac dode po usunieciu tego uzytkownika?
zakladam, ze nie przechowuje sesji w bazie

sesja w bazie = większa elastyczność i większa kontrola - jeśli userów masz też w bazie - no i więcej możliwości w kwestii bezpieczeństwa (np. sprawdzanie nie tylko sesji, ale i IP skojarzonego z sesją w bazie = brak możliwości przechwycenia sesji)

dla oszczędności 1 requestu nie warto z tego rezygnować

konto usunięte

Temat: usuniecie uzytkownika i aktywna sesja...

Jeśli dane zalogowanego usera masz w cache, to podczas kasowania usera z poziomu amina wyczyść cache i tyle. Po wywołaniu na skutek braku cache odwoła sie do bazy, tam usera już nie ma, logout. Raczej nie kasujesz userów setkami co sekunde więc wcześniejsze odświeżenie cache raz na jakiś czas nie zaszkodzi.
Łukasz Schabek

Łukasz Schabek Architekt Rozwiązań

Temat: usuniecie uzytkownika i aktywna sesja...

po usunięciu użytkownika banuj IP na jakiś czas.

Tablica zbanowany IP może być ładowana przez include w pliku index.php

edit: można i tak

$banned = array("127.0.0.10");
if (in_array($IP, $banned)) {
header('Location: http://www.example.com/logout');
}

zależy od 'wizji' ;)Łukasz Schabek edytował(a) ten post dnia 15.02.10 o godzinie 21:17

Następna dyskusja:

Znikająca sesja ;)




Wyślij zaproszenie do