Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zasada używania sesji do logowania.
Forum PHP.pl > Forum > PHP
MalyKazio
Witam,

Chcę stworzyć system logowania na moją stronkę. Mam jednak parę wątpliwości, które chciałbym, żebyście pomogli mi rozwiać.
Chodzi o zasady używania sesji do logowania.

Formularz logowania to nie problem. Chodzi mi jednak o potwierdzenie / zaprzeczenie mojemu sposobowi rozumowania.

Myślę, żeby napisać funcję powiedzmy sprawdz(), ktora będzie sprawdzała zmienna sesji powiedzmy autoryzacja i zwracała TRUE jeśli $_SESSION[autoryzacja]=1 - czyli użytkownik zalogowany (haslo i nazwa zgodne z tymi w bazie).
Dalej, co za tym idzie można by używać tej funkcji w dowolnym miejscu sprawdzając czy użytkownik jest zalogowany. Mam rację?
Jak jednak zrobić to wszystko. Powiedzmy mam plik login.php, do którego przekazywane sa dane z formularza logowania. Jeśli haslo i nazwa uzytkownika zgadzaja sie z tymi w bazie to co... wtedy zacząć sesje za pomocą session_start? Dalej... czy sesje mają jakiś swój "okres ważności"? Jeśli tak to pewnie w nagłówku każdej strony, jeśli użytkownik jest zalogowany musiałbym "odświeżyć sesję" żeby nie wygasła, tak?

Przy wylogowywaniu oczywiście session_destroy. Czy coś pominąłem? Dobrze rozumuję?
MatheW
session_start w kazdym pliku, bezwzglednie na poczatku. Potem w kazdym pliku sprawdzasz czy zalogowany jak juz mowiles.
MalyKazio
Tzn nawet jeśli nies niezalogowany to rozpoczynać sesję? A po zalogowaniu zmieniać tylko zmienna powiedzmy $_SESSION[autoryzacja] ?

Ok, dalej...
Czyli tak, w nagłowku daję session_start.

teraz wiadomo, jeśli jkest zalogowany to powedzmy wartość $_SESSION[auth]=1. Jak jednak ustawić czas ważności sesji, zeby trwała powiedzmy 60 minut. Po każdym przeładowaniu strony sesja jest odświeżana. Ale powiedzmy, że ktoś się zaloguje i przez 60 minut będzie bezczynny. Jak zrobić, żeby jego sesja wygasła i po odświeżeniu strony był wylogowany?

Dobrze, juz chyba wiem. Trzeba troche pobawić się ini_set.
Im człowiek więcej wie tym więcej ma pytań. Na webhelp.pl znalazłem tutorial do umieszczania sesji w bazie MySQL. Czy warto się tym zając? Jaką przewagę ma umieszczanie sesji w bazie nad "zwykłym"?
L_Devil
Cytat(MalyKazio @ 29.09.2006, 07:59:22 ) *
Tzn nawet jeśli nies niezalogowany to rozpoczynać sesję?
A po czym chcesz sprawdzać, czy jesteś zalogowany? Właśnie po sesji smile.gif Najpierw uruchamiasz sesję -> a dopiero potem sprawdzasz, czy jesteś zalogowany winksmiley.jpg

Cytat(MalyKazio @ 29.09.2006, 07:59:22 ) *
Dobrze, juz chyba wiem. Trzeba troche pobawić się ini_set.
ini_set służy do ustawień jądra php - do sesji nie jest mu nic potrzebne smile.gif


Cytat(MalyKazio @ 29.09.2006, 07:59:22 ) *
Jak zrobić, żeby jego sesja wygasła i po odświeżeniu strony był wylogowany?
W sesji przechowujesz czas ostatniej aktywności użytkownika (np. $_SESSION['last_activity'] = time(); // chodzi o wpisywanie aktualnego czasu na każdej podstronie). Na każdej stronie, zanim przypiszesz ten nowy czas, porównujesz go także z aktualnym, więc:
  1. <?php
  2. $dlugosc_sesji_w_sekundach = 3600; //godzinka chyba starczy, nie? :)
  3. if($_SESSION['last_activity']<time()-$dlugosc_sesji_w_sekundach)
  4. {
  5. //user nie robil nic przez godzine...
  6. header("Location: <a href="http://www.twoj-serwer.pl/strona/do/logowania/login.php");" target="_blank">http://www.twoj-serwer.pl/strona/do/logowa...gin.php");</a>
  7. }
  8. else
  9. {
  10. $_SESSION['last_activity'] = time();
  11. }
  12. ?>
Proste, nie? smile.gif


Cytat(MalyKazio @ 29.09.2006, 07:59:22 ) *
Im człowiek więcej wie tym więcej ma pytań. Na webhelp.pl znalazłem tutorial do umieszczania sesji w bazie MySQL. Czy warto się tym zając? Jaką przewagę ma umieszczanie sesji w bazie nad "zwykłym"?
Generalnie pisanie własnych sesji jest o tyle lepsze, że masz pełną kontrolę nad wszystkim, co się z sesją dzieje winksmiley.jpg A także, i to jest niezaprzeczalny bonus, masz możliwość sprawdzania, jaki użytkownik jest aktualnie zalogowany, poprzez sprawdzanie czy sesja danego użytkownika istnieje winksmiley.jpg Wady, natomiast to: musisz przewidzieć, jakie zmienne sesyjne będą ci potrzebne (tzn. dodawanie informacji "w locie" [on-the-fly] jest znacznie trudniejsze niż w klasycznych sesjach) i po drugie, właśnie ta metoda jest trudniejsza od standardowych sesji... mimo wszystko się nie zrażaj - ja swoją przygodę z sesjami zacząłem od własnej sesji winksmiley.jpg Jeżeli masz jakieś pytania jeszcze, śmiało pytaj - postaramy się ci odpowiedzieć, jak będziemy umieli najlepiej smile.gif
myth
@L_Devil: Popraw mnie jesli sie myle, ale.. jak nie bedziesz odswiezac strony powiedzmy przez 50 min, to Twoje $_SESSION['last_activity'] przyjmie wartosc NULL i dalsze sprawdzanie warunkow nie ma sensu.

Co do tematu, od czasu trwania sesji jest session.gc_maxlifetime.
Domyślnie session.gc_maxlifetime = 1440
1440/60 = ok. 24 minut

  1. <?php
  2. ini_set("session.gc_maxlifetime","3600"); // zmieniamy na godzine
  3. ?>


A zeby sesja trwała dluzej niz sesja przegladarki stosujemy session.cookie_lifetime.
pomek
Cytat
  1. <?php
  2. header("Location: <a href="http://www.twoj-serwer.pl/strona/do/logowania/login.php");" target="_blank">http://www.twoj-serwer.pl/strona/do/logowa...gin.php");</a>
  3. ?>


Czy to czemuś ma służyć? Bo wg mnie to jest śmiechu warte...

Prawidłowe przekierowanie w php z użyciem header'a:

  1. <?php
  2. header("Location: <a href="http://www.tutaj_podaj_strone.pl");" target="_blank">http://www.tutaj_podaj_strone.pl");</a>
  3. ?>


Wielki znawaca ze mnie, hehe. To tylko mój początek tongue.gif
mokry
Chwilka... Dlaczego masz tak dziwnie header?
Nie powinno byc przypadkiem tak:(?)

  1. <?php
  2. header("Location: h-t-t-p://-tutaj_podaj_strone.pl");
  3. ?>

Wtedy Cie przekiruje na stronę która chcesz. Nie wywala Ci komuniaktu o bledzie przy Twoim kodzie? snitch.gif

Ps. Bez znaków "-" w adresie i bez znaku "\" na koncu (dodawany przez bbcode z forum), czyli
Cytat
<?php
header("Location: h-t-t-p://-tutaj_podaj_strone.pl");
?>
MalyKazio
No to może pokuszę się o "własną" obsługę sesji. Znalazłem gotowy wzór tu: http://php.webhelp.pl/index.php?id=116&...php&ac=read
Może ten być? Jest ok? Już nawet snuje pewne plany jego rozbudowy smile.gif
Mam jednak pytanie. Jeśli moglibyście zerknąć w tamten skrypt i powiedzieć mi: co jest trzymane w bazie danych w kolumnie "data"? Czy dobrze rozumuje, że są to wszystkie zapisane przeze mnie zmienne sesyjne (ma mylącą nazwę ale coż)?

Cytat
Wady, natomiast to: musisz przewidzieć, jakie zmienne sesyjne będą ci potrzebne (tzn. dodawanie informacji "w locie" [on-the-fly] jest znacznie trudniejsze niż w klasycznych sesjach)


Dlaczego? Z tego co widzę, kod do którego link podałem wyżej umożliwia dodawanie zmiennych sesyjnych w dowolnej chwili i zostaną one zapisane. Nie za bardzo wiem co masz na myśli.
mokry
Jeśli chcesz fajną obsługę sesji z logowaniem (gotową) ściągnij i poczytaj to:
http://mokry.bitmar.net/sesjePHP.pdf
MalyKazio
Hmm... może i jest to fajne ale to wyższa szkoła jazdy...nie dla mnie. Jeszcze wiele mi brakuje do tego poziomu a nie chcę używać czegoś, czego nie rozumiem i nie za bardzo umiem sam modyfikować.
Co jest nie tak z obsługą sesji, do której link wkleiłem wyżej? Tą przynajmniej rozumiem i wiem o co chodzi smile.gif
L_Devil
Lecim po kolej:

Cytat(myth @ 29.09.2006, 21:10:39 ) *
@L_Devil: Popraw mnie jesli sie myle, ale.. jak nie bedziesz odswiezac strony powiedzmy przez 50 min, to Twoje $_SESSION['last_activity'] przyjmie wartosc NULL i dalsze sprawdzanie warunkow nie ma sensu.
Nie. Last_activity dotyczy tylko sesji samodzielnie tworzonych. One trwają, aż sam ich nie zakończysz - a $_TWOJA_SESJA['last_activity'] po 50 minutach będzie wynosiła obecny czas minus 50 minut winksmiley.jpg
Cytat(pomek @ 29.09.2006, 22:43:26 ) *
Czy to czemuś ma służyć? Bo wg mnie to jest śmiechu warte...

Prawidłowe przekierowanie w php z użyciem header'a:

  1. <?php
  2. header("Location: <a href="http://www.tutaj_podaj_strone.pl");" target="_blank">http://www.tutaj_podaj_strone.pl");</a>
  3. ?>


Wielki znawaca ze mnie, hehe. To tylko mój początek tongue.gif
Więc skoro to twój poczatek, to nie pisz że czyiś kod jest śmiechu warty, zwłaszcza, jeżeli nie jesteś pewny. Location: jest nagłówkiem http który pobiera jako parametr docelowe miejsce przekierowania - a więc bynajmniej nie tag html, jaki próbowałeś wcisnąć winksmiley.jpg


I, wreszcie, możemy pomóc autorowi tego wątki aarambo.gif
Cytat(MalyKazio @ 29.09.2006, 23:24:07 ) *
No to może pokuszę się o "własną" obsługę sesji. Znalazłem gotowy wzór tu: http://php.webhelp.pl/index.php?id=116&...php&ac=read
Może ten być? Jest ok? Już nawet snuje pewne plany jego rozbudowy smile.gif
Mam jednak pytanie. Jeśli moglibyście zerknąć w tamten skrypt i powiedzieć mi: co jest trzymane w bazie danych w kolumnie "data"? Czy dobrze rozumuje, że są to wszystkie zapisane przeze mnie zmienne sesyjne (ma mylącą nazwę ale coż)?
Dlaczego? Z tego co widzę, kod do którego link podałem wyżej umożliwia dodawanie zmiennych sesyjnych w dowolnej chwili i zostaną one zapisane. Nie za bardzo wiem co masz na myśli.
data to angielskie słowo oznaczające dane winksmiley.jpg Tak, w tej kolumnie są wszystkie stworzone przez ciebie zmienne sesyjne. Nie wgryzałem się w detale artykułu, ale wygląda na to, że spokojnie możesz coś takiego próbować. Jeżeli będziesz miał jakieś problemy - śmiało pisz. Postaram ci się wyjaśnić jak najlepiej będę umiał winksmiley.jpg
MalyKazio
Cytat
I, wreszcie, możemy pomóc autorowi tego wątki


Dzięki wielkie smile.gif
Póki co postanowiłem wykorzystać to, co znalazłem. Musiałem tylko zmienić funkcję session_write bo był tam mały zonk polegający na tym, że w przypadku gdy dane w sesji się zmieniły nie były one napisywanie w bazie danych (pole data) tylko doklejane i tym samym robił się bajzel. Po zamianie wygląda to mniej więcej tak:

Kod
function session_write($id, $data)
        {
        $query = "select * from zportal_sesje where id='$id'";
        $result = mysql_query("$query")
            or die("Nie mogę sprawdzić danych z bazy.");
        while($line = mysql_fetch_array($result))        
            {
            $dane = $line['data'];
            }
        if($dane != $data)
            {
            $rdata = $data;
            $query = "update zportal_sesje set data='$rdata' where id='$id'";
            $result = mysql_query("$query")
                or die(BLAD . "Nie moge zaktualizowac daty sesji.");            
            }
        }


Mała zmiana z " $rdata = $dane . $data;" na "$rdata = $data; "
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.