Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Logowanie z blokadą
Forum PHP.pl > Forum > Przedszkole
mastermindssj2
Piszę skrypt logowania i zastanawiam się w jaki sposób można utworzyć mechanizm uwierzytelniający użytkownika na stronie zabezpieczając jednocześnie przed zalogowaniem tego użytkownika z innego komputera? Chodzi o to że przykładowy użytkownik adam o haśle 1234 loguje się na stronie w domu i podczas próby zalogowania tego samego użytkownika na drugim komputerze nie ma możliwości istnienia dwóch sesji dla tego samego użytkownika. Jak to zrobić, jaki mechanizm jest najlepszy w tym przypadku, jeżeli chodzi o google nawet nie wiem co wpisać do wyszukania, czy lepiej jest żeby na drugim komputerze podczas próby logowania po prostu nie bylo mozliwosci zalogowania czy lepiej żeby wylogowało tego pierwszego?
Bardzo proszę o pomoc, pozdrawiam

Oto skrypt bez blokady podwójnego logowania
  1. <?php
  2. include('host.php'); //plik z hasłem, hostem i uzytkownikiem bazy
  3. if (isset($_POST['login']) AND isset($_POST['pass'])) {
  4. $login = $_POST['login'];
  5. $pass = $_POST['pass'];
  6. $pass = md5($pass);
  7. mysql_connect(HOST, USER, PASS) or die('Nie udało się nawiązać połączenia z bazą danych');
  8. mysql_select_db('prisonbreak') or die('Nie udało się nawiązać połączenia z bazą danych');
  9. $query = "SELECT * FROM users WHERE login = \"$login\" AND pass = \"$pass\"";
  10. $result = mysql_query($query) or die(mysql_error());
  11. if (mysql_num_rows($result) == 0) {
  12. $_SESSION['warning'] = 'Niepoprawny login lub hasło';
  13. }
  14. else {
  15. $row = mysql_fetch_assoc($result);
  16. extract($row);
  17. $_SESSION['login'] = $login;
  18. $_SESSION['lvl'] = $lvl;
  19. header('location:index.php');
  20. die();
  21. }
  22. }
  23. ?>
mortus
Użytkownik powinien móc się zalogować zawsze, takie ma prawo, bo to przecież jego konto. Oczywiście ten sam użytkownik nie powinien mieć możliwości "podwójnego" logowania się, dlatego też pierwsza jego sesja powinna być przerwana (normalnie oznaczałoby to, że użytkownik zmienił komputer, albo ktoś włamał się na jego konto, czyli zalogował się z jego danymi). Jak zaimplementować taki mechanizm? Można np. stworzyć w bazie danych tabelę online, w której będą przechowywane dane identyfikacyjne użytkownika zalogowanego (tj. ip, informacje o przeglądarce, itp. - im więcej informacji tym lepszy system), jak również identyfikator sesji i czas ostatniej aktywności (choć ten miałby głównie inną funkcjonalność). Dane te byłyby zapisywane w tabeli online podczas logowania i sprawdzane przy każdej sposobności. Jakakolwiek niezgodność danych w bazie, z tymi porównywanymi (czyli tymi, które otrzymujemy po przejściu do podstrony lub po odświeżeniu strony aktualnie przeglądanej) oznaczać będzie, że zalogowany użytkownik zalogował się z innego komputera/przeglądarki i sesja na tym komputerze/przeglądarce ma być przerwana. Odpowiednie informacje można znaleźć w tablicy superglobalnej $_SERVER.

Zapomniałem dodać, że powyższy mechanizm dotyczy sytuacji, w której to w tabeli online zapisywany jest również identyfikator użytkownika. Ponowne logowanie powoduje, że odpowiedni wiersz w tej tabeli jest usuwany (stąd brak zgodności danych podczas sprawdzania stanu zalogowania).
mastermindssj2
Dziekuję za wyczerpującą odpowiedź. Tworzę tabelkę zawierającą IP, nazwę użytkownika i SESSID, tylko zastanawiam się jak zrobić, żeby wpis bieżącej sesji był kasowany po zamknięciu okna przeglądarki przez użytkownika? Bo jeśli użytkownik wyloguje się normalnie poprzez logout.php to wiadomo
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.