Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Automatyczne logowanie.
Forum PHP.pl > Forum > Przedszkole
Giluś
Cześć, myślę jak zrobić automatyczne logowanie, ponieważ trwanie sesji jest zbyt krótkie - trwa tyle co jest włączona strona, a chce zrobić aby np.: takie logowanie trwało czas nieokreślony (wieczność..., albo 2dni dla bezpieczeństwa)

I jak to ma mniej więcej działać, wymyśliłem to tak:

1. Użytkownik loguje się, gdy poprawnie się zalogował to tworzę ciasto w którym daje wartość, jakiś kod typu: $key = md5(uniqid(mt_rand(), true));, czas trwania 30dni, oraz do bazy danych: klucz, id_użytkownika, czas_trwania (time()+2*8600)

Opcja dalsza, zamknie okno i wróci za moment, sesja już wygasła.

2. Warunek, czy sesja istnieję (w tym momencie FLASE) to wczytuję ciasteczko i pobiera z niego klucz.. następnie w bazie szuka tego klucza i sprawdza czy czas trwania nie wygasł, jeśli tak to: usuwa ciasteczko oraz tą wartość i tworzy nowy key i generuje ponownie nowy rekord do bazy i nowe ciasto i oczywiście loguje użytkownika, gdyż w bazie jest zapisany jego id, wiec na niego loguje..


Gdy ciasteczko wygasło czyli ponad 30dni.. - nic się nie dzieje, bo nie ma ciasteczka... użytkownik widzi tylko stronę dla niezalogowanego.


Czy to będzie na pewno dobrze pomyślane czy może coś poprawić ?.

Pozdrawiam..
Michael2318
Wypowiadałem się już na ten temat tutaj gdzieś, ale powtórzę się, bo dłużej tego będę szukał niż potrwa napisanie tego od nowa smile.gif

Przy logowaniu usera sprawdzasz czy user zaznaczył checkbox'a (Zaloguj mnie automatycznie: [checkbox]). Jeśli tak to:
1). Generujesz losowe id, mozna np. tak:
  1. substr((md5(rand(100, 900).microtime()).rand(100, 900)), 0, 29);

2). aktualizujesz temu userowi, który się loguje w bazie jakieś pole, nazwijmy je autologin_id. Wrzucasz do niego wartość z powyższego 'losowania' znaków
3). tworzysz mu ciasteczko np. o nazwie autologin_id z żywotnością jaką tam chcesz, ja u siebie mam 30 dni. Jako wartość też wstawiasz wylosowane znaki.
4). wrzucasz mu do bazy też jego user_agent, tak dla pewności i przy logowaniu sprawdzasz czy obecny user_agent zgadza się z tym z ostatniego logowania
5). sam warunek sprawdzający:

  1. if ( isset($_COOKIE['autologin_id'] )
  2. {
  3. $auto_id = mysql_real_escape_string($_COOKIE['autologin_id']);
  4. if ( strlen($auto_id) !== 30 )
  5. {
  6. setcookie('autologin_id', 'bad', time() - 30 * 86400); // losowe ID na bank jest złe, coś majstrował przy nim bo musi mieć równe 30 znaków
  7. header('Location: index.php');
  8. }
  9. $sql = "SELECT * FROM `users` WHERE autologin_id = '".$auto_id."'";
  10. if ( !($result = mysql_query($sql)) )
  11. {
  12. die('error<br>'.mysql_error());
  13. }
  14. $num = mysql_num_rows($result);
  15. if ( $num < 1 || ($row['user_agent'] !== $_SERVER['HTTP_USER_AGENT']) )
  16. {
  17. setcookie('autologin_id', 'bad', time() - 30 * 86400); // niszczysz ciacho w jego przeglądarce, coś niegra
  18. header('Location: index.php');
  19. }
  20. else
  21. {
  22. $_SESSION['nazwa_sesji'] = TRUE; // wszystko ok, logujesz usera
  23. }
  24. }
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.