PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl

 Szukaj:  

 » php.org.pl ver. 1.1 final

Menu...

PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl
PHP, MySQL, bazy danych, programowanie, skrypty, internet, strony www, PHP.org.pl

 

NewsLetter...

Twój mail:

Twoje imię:

 

Sonda...


Jak długo korzystasz z PHP ?

mniej niż rok
mniej niż dwa lata
więcej niż dwa lata
nie korzystam z PHP

» System autoryzacji użytkowników
Na wielu stronach aby np. przeczytać teksty lub obejrzeć obrazki trzeba się zalogować. Dzięki temu administratorzy takich serwisów mogą kontrolować osoby, które mają dostęp do poszczególnych sekcji. Dodatkowo istnije możliwość stworzenia administracji z poziomu www, a przez to dodanie kilku (nastu,dziesięciu) innych osób zajmujących się stroną.

Założenia są bardzo proste. Gdy użytkownik nie będzie zalogowany - w mechanizmie sesji status będzie ustawiony na g - czyli gość. Gdy użytkownik będzie chciał się zalogować to wtedy dostanie formularz. Jeśli go wypełni dobrze jego status zostanie zmieniony zgodnie z nadanymi przez admina uprawnieniami.
Oto trzy podstawowe statusy:

g - gość
u - użytkownik
a - administrator

Kwestia dostosowania do większej ilości rang jest poruszona dalej.

Cały skrypt będzie oparty o gotowy mechanizm sesji wbudowany w php. Funkcje dostarczone przez php są wystarczające dla zwykłego użytkownika i nie ma potrzeby pisania nowych.
Aby móc używać na swoich stronach sesji trzeba najpierw wywołać funkcję session_start(). Mówi ona php, że na tej stronie będą używane sesje. Nie jest to konieczene gdy w pliku konfiguracyjnym jest ustawiona dyrektywa session.auto_start na 1. Jednak zawsze lepiej mieć pewność, żeby nam sesje potem nie ginęły. Poniżej macie sposób jak obejść całość.
<?php
function session_load( $ini = false )
{
    if(
$ini )
    {
        
ini_set( 'session.auto_start', 1 );
    }
    else
    {
        
session_start( );
    }
}
?>

Wadą jest konieczność wywoływania tej funkcji za każdym razem, ponieważ funkcja ini_set zmienia dyrektywę konfiguracyjną tylko na okres działania skryptu, a nie 'na zawsze'.
Aby przechować zmienną w sesji trzeba ją zarejestrować. Służy do tego funkcja session_register. Do usuwania zmiennych z sesji służy funkcja session_unregister. Poniżej macie przykład użycia obydwu funkcji:
<?php
$przyklad
= time()+3600;
session_register( 'przyklad' ); // do tej funkcji mozna przekazac wiecej argumentow
echo "Przykladowa data ". date( 'd.m.y H:i') . $_SESSION['przyklad'] ."<br>";
session_unregister( 'przyklad' );
echo
"Przykladowa data ". date( 'd.m.y H:i') . $_SESSION['przyklad'] ."<br>";
?>

Jeśli chce się wam sprawdzać to zobaczcie - ale daje gwarancję, że w drugim przypadku data to będzie 01.01.70 01:00 :), co znaczy, że zmiennej nie ma. Poniżej macie przykład, ale operujący na tablicach:
<?php
$_SESSION
['przyklad'] = time()+3600; // do tej funkcji mozna przekazac wiecej argumentow
echo "Przykladowa data ". date( 'd.m.y H:i') . $_SESSION['przyklad'] ."<br>";
unset(
$_SESSION['przyklad'] );
echo
"Przykladowa data ". date( 'd.m.y H:i') . $_SESSION['przyklad'] ."<br>";
?>

Jeśli sprubójecie połączyć te sposoby to kod będzie wyglądał tak jak niżej.
<?php
$_SESSION
['przyklad'] = time()+3600; // do tej funkcji mozna przekazac wiecej argumentow
echo "Przykladowa data ". date( 'd.m.y H:i', $_SESSION['przyklad'] ) ."<br>"; // u mnie Przykladowa data 24.03.04 00:21
session_unregister( 'przyklad' );
echo
"Przykladowa data ". date( 'd.m.y H:i', $_SESSION['przyklad'] ) ."<br>"; // u mnie Przykladowa data 24.03.04 00:21
?>

Jeśli teraz już wiecie co i jak to do dzieła.
<?php
// krok 1
ini_set( 'session.use_cookies', 1 );
session_set_cookie_params( 3600 );
// krok 2
session_start( );

if( !isset(
$_SESSION['user'] ) )
{
// krok 3
    
formularz();
    
define( 'STATUS', 'g' );
}
else
{
// krok 4
    
echo "Witaj ". $_SESSION['user'] .'<br>';
    echo
'<a href="login.php?def=logout">Wyloguj mnie</a>';
    
define( 'STATUS', $_SESSION['status'] );
}

function
formularz()
{
    echo
"<form method='POST' action='login.php'>";
    echo
"Login<input type='text' name='login'><br>";
    echo
"Haslo<input type='password' name='haslo'>";
    echo
"<input type='hidden' name='from' value='".  $_SERVER['PHP_SELF'] ."'>";
    echo
"<input type='submit' value='ok'></form>";
}

?>

Kod przedstawiony powyżej jest prosty. Każemy skryptowi używać cookie, aby nie uciekły nam przypadkiem sesje tzn. po zamknięciu przeglądarki nie zostaniemy wylogowani (krok 1). Następnie inicjujemy sesję, aby móc sprawdzić, czy użytkownik jest zalogowany. Gdy nie możemy znaleść nazwy użytkownika dajemy mu status gościa i pokazujemy formularz do logowania (krok 3). W przeciwnym wypadku przejmujemy jego status (krok 4). W obydwu przypadkach status użytkownika jest utrwalony za pomocą sesji.

Teraz logowanie, czyli zapisywanie danych o użytkowniku.
<?php

ini_set
( 'session.use_cookies', 1 );
session_set_cookie_params( 3600 );

session_start( );

if( !empty(
$_POST['login'] ) && $_POST['haslo'] )
{
    if(
$dane = @file( 'users/'. $_POST['login'] ) )
    {
// uzytkownik istnieje
        
$dane = explode(';', $dane[0] ); // wyciagamy dane z pliku
        
if( md5( $_POST['haslo'] ) == $dane[1] )
        {
// zapisujemy dane gdy haslo sie zgadza
            
$_SESSION['user'] = $_POST['login'];
            
$_SESSION['status'] = $dane[0];
            
header( 'Location: '. $_POST['from'] ); //przekierowanie
            
}
        else
        {
            echo
'Podales zle haslo';
        }
    }
    else
    {
        echo
'Nieznany uzytkownik';
    }
}
elseif(
$_GET['def'] == 'logout' )
{
    
session_destroy( ); // zniszczenie sesji = wylogowanie
    
header( 'Location: '. $_SERVER['HTTP_REFERER'] ); // przekierowanie
}
else
{
    
header( 'Location: '. $_SERVER['HTTP_REFERER'] );  // przekierowanie
}

?>

Początek skryptu jest taki sam jak poprzedni. Następnie sprawdzamy czy się loguje tzn. czy podał wszystkie dane. Jeśli istnieje plik odpowiadający za użytkownika to go wczytujemy i wyciągamy z niego dane, ale tylko wtedy, gdy się zgadza hasło. Plik użytkownika wygląda tak:
a;74b87337454200d4d33f80c4663dc5e5

Pierwsza litera to status. Ciąg po średniku to hasło zapisane przy pomocy funkcji md5, aby nikt nie mógł go odgadnąć.
Gdy ktoś się chce wylogować to po prostu niszczymy sesje. Równie dobrze można użyć session_unset, ale ta tylko czyści tablicę sesji.

Na koniec kod odpowiedzialny za rejestrację użytkownika.
<?php

if( !empty( $_POST['haslo'] ) && !empty( $_POST['login'] ) )
{
    if(
file_exists( 'users/'. $_POST['login'] ) )
    {
// czy istnieje uzytkownik?
        
echo 'Uzytkownik '. $_POST['login'] .' juz istnieje';
    }
    else
    {
// nie istnieje uzytkownik
        
if( strlen( $_POST['login'] ) < 4 )
        {
// sprawdz login
            
echo "Twoj login jest za krotki";
            
rejestracja();
        }
        else
        {
            if(
strlen( $_POST['haslo'] ) < 4 )
            {
// sprawdz haslo
                
echo "Twoje haslo jest za krotkie!";
                
rejestracja();
            }
            else
            {
// zapisz dane
                
$fp = fopen( 'users/'. $_POST['login'], 'w' );
                
fwrite( $fp, 'u;'. md5( $_POST['haslo'] ) );
                
fclose( $fp );
                echo
'Zostales zarejestrowany';
            }
        }
    }
}
else
{
    
rejestracja();
}

function
rejestracja()
{
    echo
"<form method='POST' action='rejestracja.php'>";
    echo
"Login <input type='text' name='login'><br>";
    echo
"Haslo <input type='text' name='haslo'>";
    echo
"<input type='submit' value='ok'></form>";
}

?>

Schemat podobny. Gdyby przypadkiem istniał już dany użytkownik to trzeba pamiętać, że zostanie on nadpisany przez nowego, czyli po prostu staszy zniknie. Następnie sprawdzamy dane i na końcu zapisujemy je w pliku o takiej samej nazwie jak użytkownik.

Mam nadzieję, że nieco przybliżyłem wam mechanizm działania sesji na tym prostym przykładzie. Jeśli macie pytania to czekam :). Jakby coś nie działało to pytajcie się śmiało, postaram się pomóc. No i na koniec zadanie dla chętnych. Dobudować do tego przykładu datę rejestracji i jej wyświetlanie. Dla najszybszych pochwały i publikacja zwycięskiego kodu na łamach zwycięskiej strefy. IMO powinno wam starczyć tak z góra pięć minut (to nie jest żart).

Łukasz 'Splatch' Dywicki
splatch@desk.pl

Splatch  

 

Polecamy...

Zakopane
Polecamy skuterki z importu
noclegi Zakopane Krynica Zdrój
bilard
 
 
Wszelkie prawa zastrzeżone php.org.pl 2005.