![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 8.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Witam, napisałem sobie pewien system i panel administracyjny w języku PHP w oparciu o sesję oraz bazę danych MySQL. Wszystko działa bardzo dobrze ale są 2 problemy związane z współbieżnością, z którymi nie mogę sobie poradzić.
1. Problem pierwszy. Panelem administracyjnym zarządza dwóch (lub więcej) administratorów. Problem jest taki, że gdy osoba powiedzmy z miasta X się loguje loginem "abc" to inna osoba z innego miasta, powiedzmy Y, też może się zalogować w tym samym czasie na te same konto. Jak to zablokować? Mam parę pomysłów ale niestety żaden z nich nie będzie dobrze do końca działał. Jeden z pomysłów to odpowiednia wartość ustawiana w bazie danych, czyli gdy admin A loguje się do panelu to ustawiana jest mu pewna wartość 1 w bazie (czyli jest zalogowany). Gdy ktoś inny będzie się próbował zalogować na to konto to sprawdzana jest ta wartość (0 to niezalogowany, 1 to zalogowany). W momencie gdy admin A klika na "Wyloguj" to wartość w bazie przyjmuje wartość 0. To myślę by działało dobrze gdyby nie jeden fakt. W momencie gdy admin wyłączy przeglądarkę i się nie wyloguje (albo np. wywali mu korki i komputer się wyłączy) to zmienna w bazie nie powróci do wartości 0 mimo iż faktycznie ten admin nie przebywa już w PA. Skutek tego będzie taki, że nie będzie się mógł zalogować. Jak sobie poradzić z tym problemem? Szukam i szukam i nic nie wychodzi. 2. Problem drugi Blisko spokrewniony. W panelu admina jest moduł zarządzania stylami CSS. W przypadku gdy w panelu jest zalogowany admin A i B i obaj będą chcieli edytować ten sam styl to wiadomo jak to się skończy. Gdy zmiany wprowadzi admin A a następnie potem admin B to zmiany wprowadzone przez admina A zostaną nadpisane i w ogóle ich nie będzie. Chciałbym to jakoś zrobić, żeby na czas prowadzenia pracy nad danym plikiem była zablokowana jego edycja. Też przez bazę? I znowu ten sam problem z wyłączeniem przeglądarki bądź komputerem bez wylogowania. Jak sobie poradzić z takim czymś, jakie są na to metody? Z góry dziękuję za pomoc. Ten post edytował Majewicz 8.10.2011, 22:19:46 |
|
|
![]() |
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 6 Pomógł: 0 Dołączył: 8.10.2011 Ostrzeżenie: (0%) ![]() ![]() |
Żywotność sesji powinieneś raczej liczyć w minutach, nie godzinach. Tak też mam ustawione, a dokładnie na 1440 sekund.Raczej powinieneś rozważyć rozwiązanie stosowane przez Google czy Facebooka w postaci poinformowania, o równoległym zalogowaniu się na konto i możliwości wylogowania "zdublowanych" użytkowników. ad1) A czemu nie porównasz danych połączenia? Zwróć uwagę, że dwie różne osoby niemal na bank będą oznaczać różne IP, user-agenta przeglądarki czy inne tego typu dane. Przechowuj więc w sesji je i porównuj przy przechodzeniu między stronami. Jeśli wykryjesz niezgodność - zdecyduj czy killować siedzącego dotychczas, nowego czy może obu i wywalić sesję oraz poinformować, że może być tylko jeden zalogowany na danym koncie w tym samym czasie. Można też inaczej, prościej... Podczas logowania zapisz sobie pewien "odcisk" danych usera (przykładowo md5 z user-agenta). Jeśli nastąpi kolejne zalogowanie, z innym odciskiem, znowu decyduj co robić. Na razie powalczyłem z pierwszym problemem i myślę, że chyba się udało. Zrobiłem to w ten sposób, że zapisuję do bazy danych adres IP administratora, który się zalogował. Porównując datę i czasy logowania, wylogowania i ostatniej aktywności osiągnąłem zamierzony cel czyli gdy zaloguję się na dane konto to już z innego adresu nie mogę się w tym samym czasie na nie zalogować, ale z tego samego ip mogę. Ponadto gdy mam system otwarty w dwóch różnych przeglądarkach jednocześnie to wylogowanie w jednej przeglądarce powoduje wylogowanie też w drugiej. No i dzięki temu, że jest sprawdzanie IP to wyłączenie przeglądarki bez wylogowywania (albo na przykład gdy jest chwilowy brak prądu) umożliwia mi powtórne zalogowanie no chyba, że miałbym inny adres ip to wtedy musiałbym czekać te sesyjne ustalone przeze mnie 1440s. Pytanie czy zakodowanie adresu ip md5 jest bezpieczne? Taki zakodowany adres ip przechowuję w bazie danych w tabeli z loginami (dla danego loginu rzecz jasna) Powalczę jeszcze z tymi stylami. Zobaczymy co wyjdzie. Dzięki za naprowadzanie na rozwiązania moich problemów (IMG:style_emoticons/default/wink.gif) Ten post edytował Majewicz 12.10.2011, 20:28:29 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 3.10.2025 - 07:56 |