Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [Session Handler] Autologowanie
Forum PHP.pl > Forum > PHP
tiraeth
Witam,

nigdzie nie znalazłem odpowiedzi na nurtujące mnie pytanie. Jak utworzyć tzw. autologowanie na session handlerze wykorzystującym bazę danych jako miejsce przetrzymywania danych?

Struktura tabeli sessions
Kod
session_id | session_time | session_start | session_value |


Część kodu session_handler'a
  1. <?php
  2. # tworzymy nowy obiekt klasy
  3. $ses_class = new session(); 
  4.  
  5. # podmieniamy funkcje sesji php aby mozna bylo uzywac klasy
  6. session_set_save_handler (array(&$ses_class, '_open'), 
  7. array(&$ses_class, '_close'), 
  8. array(&$ses_class, '_read'), 
  9. array(&$ses_class, '_write'), 
  10. array(&$ses_class, '_destroy'), 
  11. array(&$ses_class, '_gc')); 
  12.  
  13. # startujemy sesje
  14.  
  15. class session 
  16. {
  17.  # polaczenie z baza (potrzebne do _open)
  18.  function db_connect()
  19.  { 
  20. // ...
  21.  } 
  22.  
  23.  function _open($path, $name)
  24.  {
  25. // ...
  26.  } 
  27.  
  28.  function _close()
  29.  { 
  30. // ...
  31.  } 
  32.  
  33.  function _read($ses_id)
  34.  { 
  35. // ...
  36.  } 
  37.  
  38.  function _write($ses_id, $data)
  39.  { 
  40. // ...
  41.  } 
  42.  
  43.  function _destroy($ses_id)
  44.  { 
  45. // ...
  46.  } 
  47.  
  48.  function _gc($life)
  49.  { 
  50. // ...
  51.  } 
  52. } 
  53. ?>


Kodu z funkcji nie podaję bo każdy wie na jakiej zasadzie działa smile.gif
crash
A co rozumiesz przez autologowanie? Bo jeśli to co ja (automatycznie zalogowanie użytkownika) to sama sesja tu niewiele daje...
tiraeth
Mam sobie formularz logowania, i gdy zaznaczę opcję zapamiętaj mój login, chcę aby po wyłączeniu przeglądarki i włączeniu strony ponownie (np. po 2 godzinach) sesja była aktywna - coś jak w phpBB - najlepiej gdyby ważność autologowania była ustawiona na 72 godziny (3dni).
crash
No to w czym problem? Ustawiasz ciacho z np. ID usera i może zhashowanym hasłem dla pewności. Przy wejściu na stronę sprawdzasz czy takie dane istnieją, jeśli tak i są poprawne wykonujesz to samo co przy logowaniu. Możesz też zrobić sesje ważną przez te 72 godziny. Niewiele ma to wspólnego typowo z session handlerem a i na pewno niedużo z php Pro.
aleksander
php Pro => php
Nievinny
Ja robię to za pomocą cookies. Zostawiam dwa: UserName i UserToken. UserName to nazwa użytkownika z tabeli users. Token to hash (sha1) dowolnej liczby z której pobrano uniqueid. Przy starcie strony wczytuje cookies utworzone przy logowaniu i porównuje token z bazy z tokenem cookies dla użytkownika cookies. Jeśli ok i sesja wygasła to tworzę nową o id tez zostawionym w cookies.
tiraeth
Teraz przy logowaniu mam ustawione ważność sesji na 72 godziny, ustawiam cookies w taki sposób:

  1. <?php
  2. setcookie('session_sid', SID, time()+3600*72); # identyfikator sesji
  3. setcookie('session_data', serialize($_SESSION), time()+3600*72); # wartosc sesji
  4. ?>


I teraz niestety nie wiem jak uaktywnić sesje o SID=$_COOKIE['session_sid']... wykorzystująć session_id" title="Zobacz w manualu PHP" target="_manual($_COOKIE['session_sid']) a następnie session_start, niestety nie odzyskuję poprzedniej sesji - wywala mi okienko logowanie...
aleksander
zrób coś w tym stylu:
  1. <?php
  2.  
  3. if( isset( $_COOKIE['sesja'] ) )
  4. {
  5. //istnieje cisteczko
  6. $_SESSION = unserialize( $_COOKIE['sesja'] );
  7. } else {
  8. // nie istnieje ciacho, wywoływanie logowania
  9. }
  10. ?>
a sessionid zostaw w spokoju niech będzie za każdym razem inne. Ważne żebyś zawartość $_SESSION miał taką samą.
tiraeth
Ale każdy będzie mógł sobie wtedy ustawić ciastko sesja gdzie sobie zserializuje jakieś wartości... myślałem aby ustawiał on taki sam SID po sprawdzeniu wartosci sesji....
NuLL
Po kiego grzyba zapisywać w ciastku całość sesji :?:
tiraeth
Proszę o pomoc, bo to co napisał aleksander nie działa...

Zaczęło mi się wszystko sypać i po zalogowaniu się i przeniesieniu na site przez header() wyświetla mi pustą stronę :/
Nievinny
Jak masz dane ciach z SIDem to robisz przez session_id, danych nie dajesz do ciacha. Jeżeli nie odzyskujesz id sesji to masz coś z obsługą cookies
tiraeth
  1. <?php
  2.  
  3.  $connect = mysql_connect('***', '***', '***') or die(mysql_error());
  4.  mysql_select_db('***', $connect);
  5.  
  6. if($_COOKIE['session_sid'])
  7. {
  8.  session_id($_COOKIE['session_sid']);
  9.  
  10.  echo $_COOKIE['session_id'];
  11. }
  12.  
  13.  
  14. if(!$_SESSION['logged_in'])
  15. {
  16. if(!$_POST['u'] && !$_POST['p'])
  17. {
  18.  echo '<form name=\"log\" action=\"'.$_SERVER['PHP_SELF'].'\" method=\"POST\">';
  19.  echo '<input type=\"text\" name=\"u\">&nbsp;<input type=\"password\" name=\"p\"><br /><input type=\"submit\" value=\"OK\">';
  20.  echo '</form>';
  21. }
  22. else
  23. {
  24.  # loggin in user
  25.  $result = mysql_query(&#092;"SELECT * FROM uzytkownicy WHERE username='\".$_POST['u'].\"' AND user_password='\".md5($_POST['p']).\"' LIMIT 1\")
  26.  or die(mysql_error());
  27.  
  28.  if($result && $row = mysql_fetch_assoc($result))
  29.  {
  30. if($row['username'] == $_POST['u'])
  31. {
  32.  $_SESSION['logged_in'] = 1;
  33.  $_SESSION['user_id'] = $row['user_id'];
  34.  
  35.  setcookie('session_sid', session_id(), time()+180);
  36. }
  37.  }
  38.  
  39.  header(&#092;"Location: \".$_SERVER['PHP_SELF']);
  40. }
  41. }
  42.  
  43. echo 'Zalogowany: '; echo ($_SESSION['logged_in']) ? '<b>tak</b>' : ''; echo '<br />';
  44. echo 'Userid: <b>'.$_SESSION['user_id'].'</b>';
  45. ?>


Przy takim prostym kodzie sesji, bez session_handlera, wszystko działa smile.gif Loguję się... wyłączam przeglądarkę, włączam ponownie i wyświetla, że jestem zalogowany biggrin.gif Zostały mi napisać nowy session_handler, dzięki Wam za pomoc...
hwao
Co do problemu auto logowania.

Po 1.
Ustaw cookie w sessionh z id tak zeby nie gaslo z zamknieciem przegladarki,
Po 2.
Polecam np zapisac cookie z loginem i haslem ale obie wartosci w md5 a potem sprawdzci czy w bazie takie istnieja
Kod
where md5( poleZloginem ) = $_COOKIE['login'] AND ...
Coyote
Hm... sorki za OT ale wie ktos skad mozna sciagnac taka przykladowa klase questionmark.gif
zeby miec jakis wzor co i jak questionmark.gifsmile.gif
bela
@kojot Chodzi o handler ? Jest artykuł kwiaatka na wortalu
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.