2010-09-04 10 views
7

Jak mogę to zrobić tylko 1 może być online dla 1 użytkownika w tym czasie? Pomysł ?PHP/SESSION: zaloguj się po jednym na użytkownika?

Więc np. Nie możesz zalogować się do User1 na jednym komputerze/przeglądarce, a następnie na innym komputerze/przeglądarce zalogować się do User1?

mam communitysystem w PHP i przechowuje w sesjach ..

Odpowiedz

6

Można przechowywać identyfikator sesji (i ostatni czas dostępu) w bazie danych i odrzucić próby logowania dla użytkowników o różnych identyfikatorach sesji, jeśli czas ostatniego dostępu jest zbyt krótki (powiedzmy, w ciągu ostatnich 20 minut). Wyczyść oczywiście identyfikator podczas wylogowania.

Pamiętaj jednak, że jeśli użytkownik zamknie przeglądarkę bez wylogowania, a następnie ponownie ją otworzy, może zostać zablokowany na pewien czas (20 minut powyżej lub w dowolnym innym interwale), ponieważ nie zostaną one zablokowane. mieć już odpowiedni plik cookie sesji.

3

ma potrzeby korzystania z sesji. Po prostu ustaw kolumnę w swojej tabeli users, czy użytkownik jest zalogowany, czy nie. Sprawdź to stamtąd.

Kolumna może mieć nazwę LoggedIn i może być enum ('Yes','No'). Również przechowywanie czas ostatniego logowania w jakiejś kolumnie LastLoggedIn Tak więc, gdy użytkownik chce się zalogować, najpierw sprawdź:

select 1 from users where ID = {$UserID} and `LoggedIn` = 'No' 

Jeśli wiersz jest zwracany, niech go/jej logowania.

Jeśli ktoś zapomni wylogować:

uruchomić zadanie cron lub skryptu, który po upływie określonego czasu od użytkowników, którzy są zalogowani na dłużej niż kilka godzin, sprawdzając LastLoggedIn czasu by przywrócić stan LoggedIn.

+0

Chce się upewnić, że użytkownik jest zalogowany z nie więcej niż jednego komputera, tj. Unieważnić inne sesje, gdy użytkownik ma nową sesję. @ Karem, popraw mnie, jeśli źle cię zrozumiem. – aularon

+1

Jeśli ktoś zapomni się wylogować, może zostać zablokowany na stałe. A jeśli nie śledzisz czasu ostatniego dostępu, zadanie crona wylogowałoby użytkowników, którzy nadal byli aktywni. – cHao

+0

cHao tylko to, co myślałem .. i nie chcę tego .. – Karem

6

Zakładam, że zapisujesz użytkowników w bazie danych, dodajesz pole active_session, aktualizujesz je po zalogowaniu i sprawdzasz na żądanie, aby upewnić się, że bieżący identyfikator sesji użytkownika jest zgodny z ostatnim zapisanym w bazie danych.

Na Login:

UPDATE `users` SET `active_session`='$session_id'; 

Kiedy użytkownik przechodzi na stronę, która wymaga logowania, ty wyszukiwania, która wartość:

SELECT * FROM users WHERE `active_session`='$session_id'; 

ten sposób, gdy użytkownik wpisze w innym miejscu, poprzednia sesja klucz zostanie nadpisany, a powyższy SELECT zwróci pusty zestaw wyników.

0

Najlepszym sposobem na zrobienie tego jest utworzenie dodatkowej kolumny w tabeli użytkowników, która domyślnie jest ustawiona na 0 (fałsz), a po zalogowaniu na wartość 1 (prawda). Następnie, gdy użytkownik wyloguje się, resetuje się do wartości 0. Co kilka godzin uruchamiaj sprawdzanie, co wymaga kliknięcia przycisku Tak, aby kontynuować sesję lub automatycznego wylogowania po osiągnięciu przez licznik czasu zera. Podłoga jest taka, że ​​im dłużej pozostawisz to, dopóki nie uruchomisz czeku, tym dłużej użytkownik będzie musiał czekać, aby móc się ponownie zalogować, jeśli opuścił twoją witrynę i odszedł prosto, nie wylogowując się poprawnie, ponieważ stół użytkownika nadal byłby dostępny. prawda do wylogowania. Efekt uboczny polega na częstszym wprowadzaniu danych przez użytkownika przed utratą dostępu przez dłuższy czas. Należy go zważyć, aby nie przeszkadzał użytkownikowi. Można wykryć, że użytkownik opuścił witrynę za pomocą js, a następnie wylogować się, ale użytkownik może wyłączyć tę funkcję i dlatego nie jest wiarygodny.

0

W pewnym sensie wykonuję to samo zadanie, gdy chcę, aby użytkownik miał tylko jedną sesję. To może być tylko on, który korzysta z konta, a nie wiele innych osób.

Sposób, w jaki to zaprojektowałem, polega na tym, że mam jeden stół, w którym przechowuję początek i koniec sesji. Służy to użytkownikowi do sprawdzenia, jak długo trwała ostatnia wizyta i kiedy był ostatni w Internecie.

Następnie zaprojektowałem tabelę sesji, w której aktualizuję datę/godzinę za każdym razem, gdy użytkownik coś robi. Jeśli czas tutaj jest starszy niż 30-60 minut (jeszcze nie ustalono zakresu), wartość sesji zostanie usunięta. Dzięki temu użytkownik może zalogować się ponownie później, jeśli zdecyduje się to zrobić. Ale nie w przedziale czasowym 30-60.

Tabela sesji będzie śledzona przez zadanie cron.

0

Moje pomysłem byłoby kontynuować stąd pierwsza odpowiedź widziałem:

Można przechowywać identyfikator sesji (i ostatni czas dostępu) w bazie danych, a odrzucania prób logowania dla użytkowników z różnych identyfikatorów sesji jeżeli dane czas ostatniego dostępu jest zbyt krótki (powiedzmy, w ciągu ostatnich 20 minut). Wyczyść oczywiście identyfikator podczas wylogowania.

Utwórz kolumnę current_session w bazie danych, kiedy użytkownicy zalogowali się, zapisz bieżącą sesję w tabeli, zakładamy, że mamy czas logowania ustawiony na 20 minut, a użytkownik po zalogowaniu zamyka swoją przeglądarkę i ponownie wraca w ciągu 10 minut, więc tutaj mamy jego stary zestaw sesji, który jest ważny przez 20 minut, ale w ostatnim razem zamknął przeglądarkę, więc tym razem będzie miał nowy identyfikator sesji, więc złapiemy tę niezgodność sesji i tutaj poprosimy użytkownika o zaloguj ponownie, usuwając stary zapis, który zachowaliśmy.

2

Dla każdego, kto może potrzebować tego w przyszłości.

Gdy użytkownik tworzy sesję lub loguje się, może pobrać identyfikator sesji, który generuje, i zapisać go w kolumnie w bazie danych na koncie tego użytkownika. Następnie na każdej stronie aplikacji sprawdź, czy bieżący identyfikator sesji odpowiada identyfikatorowi przechowywanemu w bazie danych dla tego użytkownika. Jeśli nie, zabij bieżącą sesję i przekieruj ją na stronę logowania.

W ten sposób identyfikator sesji będzie różny dla każdego urządzenia, którego używają do logowania.

+0

Co zrobić, jeśli użytkownicy korzystają z tego samego pliku cookie, a więc z tej samej sesji? – antoineg

Powiązane problemy