Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Blokowanie podwójnego logowania
Forum PHP.pl > Forum > Przedszkole
malpik_orginal
Witam

jestem nowym użytkownikiem i nie wiem czy swój problem dobrze umieściłem jeśli nie to przepraszam i proszę o wyrozumiałość.

Pokrótce opiszę swój problem którego rozwiązania niestety nie znalazłem na forum a może po prostu słabo szukałem sad.gif

Mianowicie chodzi o to że potrzebuję zrobić coś takiego żeby na jeden login i hasło nie można było się logować równocześnie.
Czyli ja jestem zalogowany a kolega który zna mój login i hasło też chce się zalogować to ma dostać " Ktoś już jest zalogowany na Twój login"

Od razu powiem że chcę to dodać już do istniejącej platformy opartej na PHP i MySql.

A jeszcze jedno przy okazji chciałem się zapytać czy jest możliwość zrobienia czegoś takiego jak zliczanie ile razy się dany użytkownik zalogował i np
po 10 razie żeby musiał zmienić hasło i np żeby 5 ostatnich haseł było przechowywane questionmark.gif

Dziękuję za jakiekolwiek podpowiedzi/rady ( oczywiście wujek google też będzie radą biggrin.gif)
Sephirus
Co do blokady drugiego logowania to wystarczy dodać pole (na przykład "last_activity") do bazy danych do tabelki z użytkownikami. Pole to będzie datą ostatniej aktywności użytkownika - trzeba by było updateować to pole przy każdym odświeżeniu strony (z założenia) ustawiając aktualną datę. Oczywiście mówię o sytuacji gdy użytkownik jest już zalogowany.

Wylogowanie powinno wylogować użytkownika oraz ustawić "last_activity" na jakąś starą datę (na przykład 1 stycznia 2000 00:00:00 tongue.gif).

Logowanie:

Przy logowaniu sprawdzasz czy dane są prawidłowe jak zwykle oraz dodatkowo czy pole last_activity nie jest starsze od "teraz" o czas trwania sesji (na przykład 15 minut - po tym czasie sesja się nie odnowi i użytkownik i tak zostanie wylogowany). Jeżeli te warunki są spełnione, logujesz użytkownika i ustawiasz "last_activity" na teraz.

Próba logowania #2 i kolejna:

Jeżeli last_activity jest młodsze niż "teraz" - 15 minut to wyrzucasz, że ktoś jest aktualnie zalogowany.

Można do tego dodać zapamietywanie sesji, IP itp... dla bardziej zaawansowanych opcji.

Co do pytania drugiego to też żaden problem - dodaj pole "licznik" do tabelki z uzytkownikami i zwiększaj je o 1 przy każdym logowaniu danego usera. Przy logowaniu sprawdzaj też czy pole licznik jest podzielne przez liczbę logowań po których następuję zmiana hasła (licznik % 5 == 0 - na przykład). Jeżeli wychodzi na to że jest logowanie wymagające zmiany hasła - generujesz nowe hasło - stare możesz trzymać w jakiejś innej tabelce czy w jakimś innym polu ewentualnie. Hasło możesz wysłać na mail itd... to już należy do Ciebie wink.gif
redelek
Ja bym to zrobił na bazie, albo do istniejącej dodał kilka pól takich jak np: status_login i tu cyfra 1 lub 0 , podczas logowania sprawdza która jest . Jeśli 1 to odmawia zalogowania. Status się zmienia po wylogowaniu na 0.
Tak samo bym zrobił ze zmianą hasła po każdym logowaniu pobiera cyferkę z bazy dodaje 1 i zapisuje, jeśli będzie 10 to przerzuca na strone gdzie trzeba zmienić hasło.
Co prawda trzeba sie zastanowić czy takie zabezpieczenia są konieczne i czy nie utrudnią życia smile.gif może wystarczy użyć md5 do "haszowania" haseł i logowanie przełączyć na https a nie na http?

Decyzje pozostawiam Tobie. To mój pomysł na Twoje problemy
malpik_orginal
Z wymuszaniem zmiany haseł właśnie chodzi o to aby utrudnić życie ponieważ nie chcę aby użytkownik przekazywał swój login i hasło innym i żeby miał świadomość tego że jak udostępni to będzie musiał zaraz zmieniać hasło ( może mało to jest user friendly ale ..) i myślę że rozwiązanie radelka chyba będzie prostszym odnośnie równoległego logowania.

A jeśli chodzi o przetrzymywanie użytych haseł to właśnie są one "haszowane" i nie za bardzo wiem jak zrobić mechanizm sprawdzający

Ale oczywiście dziękuje wam za sugestie
Sephirus
@redelek - mała sugestia smile.gif

Co do twojej propozycji logowania z polem 0/1 - co w przypadku gdy użytkownik zaloguje się a następnie wyłączy przeglądarkę i nie wróci na tą stronę przez miesiąc? - Nikt już nie będzie mógł się zalogować bo pole będzie miało 1 a nie będzie aktualnie zalogowanego usera - stąd moja propozycja z datą wink.gif
gothye
Cytat(redelek @ 23.11.2011, 09:37:03 ) *
Ja bym to zrobił na bazie, albo do istniejącej dodał kilka pól takich jak np: status_login i tu cyfra 1 lub 0 , podczas logowania sprawdza która jest . Jeśli 1 to odmawia zalogowania. Status się zmienia po wylogowaniu na 0.


Ale jeśli sesja wygaśnie samoczynnie to user nie będzie mógł się zalogować ponownie ,ponieważ dalej pole status będzie = 1 , wiec tutaj warto dodać pole last_active i porównywać z czasem trwania sesji użytkownika.
malpik_orginal
no to faktycznie z systemem 0/1 może być problem ale może ja nie rozumiem albo jeszcze za mało kawy się napiłem jak użyć do tego znacznika czasu questionmark.gif
musiała by się ta wartość non stop aktualizować
Sephirus
Raczej tak - może nie non-stop ale albo przy każdej akcji użytkownika trzeba by dać

  1. UPDATE users SET last_activity = NOW() WHERE id=ID_USERA


albo wykonywać to raz na ileś akcji
abort
Można w mechaniźmie sesji akualizować w bazie danych pola 'last_activity' i 'logged'. I sprawdzać warunki:
- jeżeli jest zalogowany i last_activity jest mniejsze niż (ustalona odgórnie) długość sesji - zabraniać wejścia
- jeśli jest zalogowany, ale gość się nie wylogował, to robić update bazy (starego wpisu), uaktualniać w tym wpisie "logged" na OFF, apotem stworzyć nową sesję
- jeśli nie jest zalogowany, to tworzyć nową sesję

Oczywiście wszystko wiąże się z uaktualnieniami w bazie, i to w przeciągu trwania całej sesji, czyli update pola 'last_activity' musisz uaktualniać praktycznie przy otwarciu każdej nowej strony.

Sephirus: raz na ileś akcji? Niezbyt dobre imho.
Przykład: sesja ustawiona na godzinę - jeśli uaktualniasz nawet co drugą akcję, to user zaloguje się, pójdzie sobie na kawę i śniadanie (powiedzmy 30 minut), potem coś kliknie, znów nie będzie aktywny w serwisie przez kolejne powiedzmy 40 minut, i już mamy ponad 1h. Chyba że źle zrozumiałem.
malpik_orginal
A co powiecie na wykorzystanie mechanizmu "kto jest on-line"
skoro jest coś takiego powinno się móc to wykorzystać
( nie wiem czy dobrze myślę ale skoro jest coś już gotowego to czemu tego w jakiś sposób nie wykorzystać )

To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.