Crearea unei autorizații php mysql complexe. Construirea unui sistem de înregistrare incredibil de simplu în PHP și MySQL

Buna ziua! Acum vom încerca să implementăm cea mai simplă înregistrare pe site folosind PHP + MySQL. Pentru a face acest lucru, Apache trebuie să fie instalat pe computer. Principiul de funcționare al scenariului nostru este prezentat mai jos.

1. Să începem prin a crea tabelul utilizatori în baza de date. Acesta va conține datele utilizatorului (login și parolă). Să mergem la phpmyadmin (dacă creați o bază de date pe computer http://localhost/phpmyadmin/). Creați un tabel utilizatorii, va avea 3 câmpuri.

Îl creez în baza de date mysql, îl poți crea într-o altă bază de date. Apoi, setați valorile ca în figură:

2. Este necesară o conexiune la acest tabel. Să creăm un fișier bd.php. Conținutul său:

$db = mysql_connect("serverul dvs. MySQL","login pentru acest server","parola pentru acest server");
mysql_select_db ("numele bazei de date la care ne conectăm", $db);
?>

In cazul meu arata cam asa:

$db = mysql_connect("localhost","user","1234");
mysql_select_db("mysql",$db);
?>

Salvați bd.php.
Grozav! Avem un tabel în baza de date și o conexiune la acesta. Acum puteți începe să creați o pagină pe care utilizatorii își vor lăsa datele.

3. Creați un fișier reg.php cu conținutul (toate comentariile în interior):



Înregistrare


Înregistrare
















4. Creați un fișier, care va introduce date în baza de date și va salva utilizatorul. save_user.php(comentarii in interior):



{
}
//dacă sunt introduse datele de conectare și parola, atunci le procesăm astfel încât etichetele și scripturile să nu funcționeze, nu știi niciodată ce ar putea introduce oamenii


//eliminați spațiile suplimentare
$login = trim($login);
$parola = trim($parola);
// se conectează la baza de date
// verifică existența unui utilizator cu aceeași autentificare
$rezultat = mysql_query("SELECT ID FROM utilizatorii WHERE login="$login"",$db);
dacă (!empty($myrow["id"])) (
exit("Ne pare rău, datele de conectare introduse sunt deja înregistrate. Vă rugăm să introduceți o altă autentificare.");
}
// dacă nu există așa ceva, atunci salvați datele
$rezultat2 = mysql_query("INSERT INTO users (login,parola) VALUES("$login","$parola")");
// Verificați dacă există erori
dacă ($result2=="TRUE")
{
echo "Te-ai inregistrat cu succes! Acum poti intra pe site. Pagina de pornire";
}
altceva(
echo „Eroare! Nu sunteți înregistrat.”;
}
?>

5. Acum utilizatorii noștri se pot înregistra! Apoi, trebuie să creați o „ușă” pentru ca utilizatorii deja înregistrați să intre pe site. index.php(comentarii in interior):

// întreaga procedură funcționează în sesiuni. Este locul în care sunt stocate datele utilizatorului în timp ce acesta se află pe site. Este foarte important să le lansăm chiar la începutul paginii!!!
sesiune_start();
?>


pagina principala


pagina principala











Inregistreaza-te



// Verificați dacă variabilele de conectare și ID utilizator sunt goale
if (gol ($_SESSION["login"]) sau gol($_SESSION["id"]))
{
// Dacă este gol, atunci nu afișăm linkul
echo „Ești autentificat ca invitat
Acest link este disponibil numai pentru utilizatorii înregistrați”;
}
altfel
{

În dosar index.php Vom afișa un link care va fi deschis doar pentru utilizatorii înregistrați. Acesta este scopul scriptului - limitarea accesului la orice date.

6. Rămâne un fișier cu verificarea login-ului și a parolei introduse. testreg.php (comentarii în interior):

session_start();// întreaga procedură funcționează pe sesiuni. Este locul în care sunt stocate datele utilizatorului în timp ce acesta se află pe site. Este foarte important să le lansăm chiar la începutul paginii!!!
if (isset($_POST["login"])) ( $login = $_POST["login"]; if ($login == "") ( unset($login);) ) //introduceți datele de conectare introduse de utilizatorul în variabila $login, dacă este goală, atunci distrugeți variabila
if (isset($_POST["parolă"])) ( $parolă=$_POST["parolă"]; dacă ($parolă =="") ( unset($parolă);) )
// pune parola introdusă de utilizator în variabila $parolă, dacă este goală, atunci distruge variabila
if (empty($login) sau empty($parola)) //dacă utilizatorul nu a introdus un login sau o parolă, atunci emitem o eroare și oprim scriptul
{
exit("Nu ați introdus toate informațiile, întoarceți-vă și completați toate câmpurile!");
}
//dacă sunt introduse datele de conectare și parola, atunci le procesăm astfel încât etichetele și scripturile să nu funcționeze, nu știi niciodată ce ar putea introduce oamenii
$login = stripslashes($login);
$login = htmlspecialchars($login);
$parolă = bare bare($parolă);
$parolă = htmlcaracterele speciale($parolă);
//eliminați spațiile suplimentare
$login = trim($login);
$parola = trim($parola);
// se conectează la baza de date
include("bd.php");// fișierul bd.php trebuie să fie în același folder cu toate celelalte, dacă nu este, atunci doar schimbați calea

$rezultat = mysql_query("SELECT * FROM users WHERE login="$login"",$db); //preluați din baza de date toate datele despre utilizator cu datele de conectare introduse
$myrow = mysql_fetch_array($rezultat);
dacă (gol ($myrow[„parolă”)))
{
//dacă utilizatorul cu autentificarea introdusă nu există
}
altceva(
//dacă există, atunci verificați parolele
if ($myrow["parolă"]==$parolă) (
//dacă parolele se potrivesc, atunci lansăm o sesiune pentru utilizator! Îl poți felicita, a intrat!
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//aceste date sunt folosite foarte des, astfel încât utilizatorul conectat le va „purta cu el”
echo "Ați intrat cu succes pe site! Pagina de pornire";
}
altceva(
//dacă parolele nu se potrivesc

Ieșire („Ne pare rău, autentificarea sau parola pe care le-ați introdus sunt incorecte.”);
}
}
?>

OK, totul sa terminat acum! Lecția poate fi plictisitoare, dar foarte utilă. Aici este afișată doar ideea de înregistrare, apoi o puteți îmbunătăți: adăugați protecție, design, câmpuri de date, încărcare avatare, deconectare din cont (pentru a face acest lucru, pur și simplu distruge variabilele din sesiune cu funcția neasezat) și așa mai departe. Noroc!

Am verificat totul, funcționează corect!

De la autor: Mai devreme sau mai târziu, fiecare dezvoltator web se confruntă cu sarcina de a restricționa accesul la o anumită pagină/pagini sau director. Aceasta ar putea fi pur și simplu o pagină secretă a site-ului, partea administrativă a site-ului sau orice altă secțiune la care dorim să restricționăm accesul și să furnizăm doar o parolă. Pentru a face acest lucru, puteți, desigur, să utilizați instrumente de server. Cred că orice găzduire modernă are o funcție de protejare cu parolă a unui director, în care poți crea un utilizator, îi poți atribui o parolă și, după protejarea cu parolă a directorului, accesul la directorul închis va fi asigurat numai după introducerea corectă a directorului. autentificare și parolă. Dar uneori vrei să scrii ceva tu, ceva rapid, simplu, dar în același timp de încredere...

În această lecție vom încerca să scriem propriul nostru sistem simplu de autorizare. Vom avea o pagină secretă - să presupunem că va fi o pagină de administrator, la care vom oferi acces doar unui utilizator autorizat. Sistemul nostru de autorizare se va baza pe mecanismul de sesiune. Înainte de a continua această lecție, vă recomand să vă familiarizați cu una dintre lecțiile mele anterioare, în care, în special, luăm în considerare munca sesiunilor -.

Pe scurt, toate lucrările cu sesiuni pot fi împărțite în 3 etape:

Deschiderea sesiunii. Pe toate paginile în care este implicată lucrul cu sesiuni, sesiunea trebuie pornită folosind funcția session_start().

Înregistrarea variabilelor de sesiune.

Anularea înregistrării variabilelor de sesiune utilizând funcția unset() și închiderea sesiunii folosind funcția session_destroy().

Pasul 1

Deci, pentru munca noastră, vom crea 3 fișiere - Pagina de pornire (index.php), Contacte (contact.php) și Panoul de administrare (admin.php). Vă rugăm să rețineți că extensia de fișier la care vom restricționa accesul ar trebui să fie .php. După cum ați ghicit, vom restricționa accesul la fișierul admin.php. Codul pentru toate fișierele este cel mai simplu - este un fel de meniu într-o linie cu link-uri către alte pagini, iar sub acesta textul individual al fiecărei pagini, astfel încât să le putem distinge unul de celălalt. Iată, de exemplu, codul pentru pagina de index:

Acasă | Contacte | Admin


Aceasta este pagina principală

Paginile rămase, așa cum am spus, diferă de el doar în textul de după eticheta de linie. Nu am creat pagini cu drepturi depline cu metaetichete, deoarece sarcina noastră este doar să restricționăm accesul la o anumită pagină.

Pasul 2

Deocamdată, putem naviga liber în toate paginile, inclusiv în pagina de administrare. Cum putem limita accesul la el? Cum va fi algoritmul? Vom face următoarele: chiar la începutul paginii vom verifica dacă eticheta de care avem nevoie se află în sesiune sau, mai simplu, dacă există o anumită variabilă de sesiune (putem verifica și dacă valoarea unei variabile de sesiune este egală). la o anumită valoare). Dacă nu există o astfel de variabilă, atunci utilizatorul care solicită această pagină nu este autorizat, ceea ce înseamnă că îl vom redirecționa către pagina de autorizare, unde i se va cere să completeze un formular cu nume și parolă. Algoritmul este extrem de simplu - să-l implementăm. Accesați fișierul admin.php, deschideți construcția PHP în partea de sus și scrieți următorul cod:

sesiune_start();

dacă (! $_SESSION [ "admin" ] ) (

header("Locație: enter.php");

Ieșire ;

Să citim acum acest cod. În primul rând, am deschis o sesiune, după cum vă amintiți - aceasta este o condiție prealabilă atunci când lucrați cu sesiuni. Apoi, am creat o condiție simplă care poate fi citită astfel: „dacă elementul admin nu există în matricea $_SESSION, vom executa blocul de acțiuni cuprins între paranteze operator.” Iar în blocul de cod, folosind funcția header(), redirecționăm utilizatorul către pagina enter.php (aceasta este pagina de autorizare). După funcția header(), trebuie să finalizăm execuția scriptului folosind funcția exit(). Dacă condiția nu este îndeplinită, adică va exista un element admin în matricea $_SESSION, aceasta înseamnă că utilizatorul a fost deja autorizat cu succes și vom sări peste blocul de acțiuni din parantezele operatorului, adică nu va avea loc nicio redirecționare, si aratam pagina solicitata.

Pasul 3

Acum trebuie să creăm o pagină de conectare - enter.php. Pentru a face acest lucru, copiați codul, de exemplu, al paginii contact.php, creați un fișier nou și inserați codul copiat în el. Salvați fișierul sub numele enter.php. Acum, pe această pagină vom scrie un formular simplu pentru introducerea numelui de utilizator și a parolei:

Acasă | Contacte | Admin


Aceasta este pagina de conectare.
Nume de utilizator:
Parola:

< p > < a href = "index.php" >Acasă< / a > | < a href = "contact.php" >Contacte< / a > | < a href = "admin.php" >Admin< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Nume de utilizator:< input type = "text" name = "user" / > < br / >

Parola:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "A intra" / >

< / form >

Totul este simplu aici. Formularul are 2 câmpuri: un câmp de autentificare (noi l-am numit „utilizator”) și un câmp de parolă (numit „pass”). Am creat, de asemenea, un buton (nume „trimite”), atunci când dai clic, vor fi trimise datele din formular. Datele sunt trimise folosind metoda post - am specificat acest lucru în atributul method al etichetei formular - și vor fi procesate pe aceeași pagină. Acum putem încerca să mergem la pagina de administrare. Dacă totul se face fără erori, nu vom putea ajunge acolo, dar vom ajunge invariabil pe pagina de autorizare.

Uimitor!

Pasul 4

În continuare, trebuie să scriem un handler pe pagina cu formularul care va primi date din formular și să comparăm dacă login-ul și parola din formular se potrivesc cu cele pe care le avem. Pentru a face acest lucru, deschideți construcția PHP din partea de sus a paginii de conectare și începeți să scrieți codul. În primul rând, trebuie să deschidem o sesiune - la urma urmei, aici vom crea o etichetă în sesiune dacă am primit login-ul și parola corecte. Pe aceasta pagina vom stoca login-ul si parola administratorului. De obicei, aceste date sunt stocate într-o bază de date (DB), dar vom avea doar 1 utilizator (administrator) și, prin urmare, stocarea datelor sale pentru a vă conecta în DB nu este în întregime rațională. Dacă există mai mult de un utilizator, adică, de exemplu, scriem un proiect în care există înregistrare, atunci, desigur, în acest caz va fi dificil să faceți fără o bază de date.

Deci, autentificarea noastră va fi „admin” și o vom stoca în variabila $admin. Parola va fi „mypass” și va fi stocată în variabila $pass. Dar stocarea parolelor în text clar nu este acceptată - acest lucru este contrar principiilor de securitate. Vom stoca parola în formă criptată, iar funcția md5() ne va ajuta să o criptăm. Această funcție criptează un șir folosind un algoritm special, iar rezultatul este un șir de 32 de caractere (numit hash). Dacă criptăm șirul „mypass” (acest lucru se poate face, de exemplu, în fișierul contact.php):

echo md5 ("mypass");

apoi rezultatul va fi linia „a029d0df84eb5549c641e04a9ef389e5″ - aceasta va fi parola noastră criptată. Pentru moment, codul paginii de conectare va fi astfel:

Acasă | Contacte | Admin


Aceasta este pagina de conectare.
Nume de utilizator:
Parola:

sesiune_start();

$admin = "admin" ;

$trece = „a029d0df84eb5549c641e04a9ef389e5”;

< p > < a href = "index.php" >Acasă< / a > | < a href = "contact.php" >Contacte< / a > | < a href = "admin.php" >Admin< / a > < / p >

< hr / >

< br / >

< form method = "post" >

Nume de utilizator:< input type = "text" name = "user" / > < br / >

Parola:< input type = "password" name = "pass" / > < br / >

< input type = "submit" name = "submit" value = "A intra" / >

< / form >

Pasul 5

Acum să verificăm ce am primit din formular cu ceea ce avem în variabilele de conectare și parolă. Vom face acest lucru condiționat - numai dacă este apăsat butonul de formular. Cum putem verifica asta? Butonul are un nume („trimite”), iar noi transmitem date folosind metoda postării. În consecință, putem verifica pur și simplu dacă elementul de trimitere există în matricea $_POST. Dacă există, butonul a fost apăsat, iar noi vom efectua acțiuni de verificare a datelor trimise, altfel nu vom face nimic. După declararea login-ului și a parolei, scriem condiția:

if($_POST["trimite"])( if($admin == $_POST["utilizator"] ȘI $trece == md5($_POST["trece"]))( $_SESSION["admin"] = $ admin; header("Locație: admin.php");

Autentificarea sau parola este incorectă!

"; }

dacă ($_POST["trimite"]) (

dacă ($ admin == $_POST [ "utilizator" ] ȘI $ trece == md5 ( $ _POST [ "trece" ] ) ) (

$_SESSION["admin"] = $admin;

Ieșire ;

) altfel ecou "

Autentificarea sau parola este incorectă!

" ;

Am pus condiția de verificare a login-ului și a parolei duble. Acest lucru se face folosind operatorul logic AND (se poate scrie și în acest fel - „&&”). Condiția poate fi citită după cum urmează: „dacă (variabila $admin este egală cu elementul utilizator din matricea $_POST ȘI variabila $pass este egală cu hash-ul elementului pass din matricea $_POST) atunci (efectuăm blocul de acțiuni) altfel afișăm textul „Autentificare sau parola este incorectă!”

Dacă perechea login-parolă se potrivește, atunci înregistrăm variabila de sesiune $_SESSION["admin"] și redirecționăm utilizatorul către pagina de admin - admin.php.
Să încercăm acum să testăm ceea ce am creat deja. Dacă introducem o autentificare și o parolă în mod deliberat false, vom primi un mesaj de avertizare că „Autentificarea sau parola este incorectă!” Să încercăm acum să introducem informațiile de conectare corecte. Dacă nu am greșit nicăieri, atunci după ce facem clic pe butonul „Autentificare” ne vom găsi pe pagina de administrare.

Pasul 6

Acum tot ce mai rămâne de făcut este să adăugați câteva detalii minore. De exemplu, acum suntem autorizați în sistem, dar dacă introducem adresa paginii de autorizare în bara de adrese, vom ajunge ușor la ea și vom vedea formularul de autorizare. Acest lucru nu ar trebui să se întâmple - doar un utilizator neautorizat ar trebui să vadă formularul. Cum putem remedia asta? Amintiți-vă că pe pagina admin.php am verificat dacă eticheta era în sesiune. Dacă nu este acolo, am redirecționat utilizatorul către pagina de autorizare. Aici putem face același lucru, doar invers. Adică verificăm și dacă eticheta este în sesiune. Abia acum vom transfera utilizatorul pe pagina de administrare dacă există o astfel de etichetă. Acest lucru este, în principiu, logic. Dacă există o etichetă, atunci utilizatorul este deja autorizat și îl putem transfera pe pagina de administrare. Pe pagina enter.php după începerea sesiunii, adăugați următorul cod:

if($_SESSION["admin"])( header("Locație: admin.php"); ieșire; )

dacă ($_SESSION[„admin”]) (

antet ("Locație: admin.php" );

Ieșire ;

Acum, dacă un utilizator autorizat încearcă să introducă numele paginii de autorizare în bara de adrese, va fi redirecționat către pagina de administrare. Un utilizator neautorizat va putea accesa liber pagina de autorizare.

Pasul 7

Următorul punct pe care trebuie să-l furnizăm este implementarea deconectarii unui utilizator autorizat, adică să presupunem că administratorul și-a încheiat munca și trebuie să se deconecteze, astfel încât nimeni să nu poată lucra în contul său. Pentru a face acest lucru, adăugați un link „Ieșire” la pagina admin.php. Link-ul va duce la aceeași pagină, doar parametrul de care avem nevoie i se va adăuga. Parametrul este adăugat folosind un semn de întrebare:

Ieșire

< a href = "admin.php?do=logout" >Ieșire< / a >

Acest link poate fi plasat în locul unde avem nevoie - îl voi pune după textul paginii. În ceea ce privește parametrul, acesta va fi transmis prin metoda GET (rețineți că am transmis datele din formular folosind al doilea parametru - POST). Când utilizați această metodă, datele sunt atașate la adresa din bara de adrese și sunt separate de adresă doar printr-un semn de întrebare. Trecem un parametru - do - și, în același timp, îi atribuim valoarea „logout”. Cum putem autoriza utilizatorul acum? Este foarte simplu - a doua și a treia etapă ne vor ajuta aici când lucrăm cu sesiuni. Când pagina se încarcă, putem verifica valoarea elementului do din matricea $_GET. Dacă este egal cu șirul „logout”, pur și simplu vom anula înregistrarea variabilei de sesiune $_SESSION["admin"] și vom distruge sesiunea. În consecință, nu va mai exista nicio etichetă în sesiunea după aceasta, iar în blocul următor, unde verificăm prezența etichetei, utilizatorul va fi redirecționat către pagina de autorizare. E simplu.

Procesul de creare a unui sistem de înregistrare presupune destul de multă muncă. Trebuie să scrieți un cod care verifică de două ori validitatea adreselor de e-mail, trimite e-mailuri de confirmare, oferă posibilitatea de a recupera parolele, stochează parolele într-un loc sigur, validează formularele de introducere și multe altele. Chiar și atunci când faceți toate acestea, utilizatorii vor fi reticenți să se înregistreze, deoarece chiar și cea mai minimă înregistrare necesită activitatea lor.

În tutorialul de astăzi, vom dezvolta un sistem simplu de înregistrare care nu va necesita parole! Rezultatele vor fi un sistem care poate fi ușor modificat sau integrat într-un site web PHP existent. Dacă ești interesat, continuă să citești.

PHP

Acum suntem gata să începem cu codul PHP. Funcționalitatea principală a sistemului de înregistrare este asigurată de clasa User, pe care o puteți vedea mai jos. Clasa folosește (), care este o bibliotecă de baze de date minimalistă. Clasa User este responsabilă pentru accesarea bazelor de date, generarea de jetoane de autentificare și validarea acestora. Ne prezintă o interfață simplă care poate fi încorporată cu ușurință în sistemul de înregistrare a site-urilor dumneavoastră bazate pe PHP.

User.class.php

// Instanță ORM privată
$orm privat;

/**
* Găsiți un utilizator după un șir de simbol. Sunt luate numai jetoane valide
* considerare. Un token este valabil timp de 10 minute după ce a fost generat.
* @param șir $token Jetonul de căutat
* @return Utilizator
*/

Funcția publică statică findByToken($token)(

// găsiți-l în baza de date și asigurați-vă că marcajul de timp este corect


->unde(„token”, $token)
->where_raw("validitate_token > ACUM()")
->găsește_unul();

Dacă(!$rezultat)(
returnează fals;
}

Returnează utilizator nou ($rezultat);
}

/**
* Fie autentificați-vă, fie înregistrați un utilizator.
* @return Utilizator
*/

Funcție publică statică loginOrRegister($email)(

// Dacă un astfel de utilizator există deja, returnați-l

Dacă(Utilizator::există($email))(
returnează utilizator nou ($email);
}

// În caz contrar, creați-l și returnați-l

Return User::create($email);
}

/**
* Creați un utilizator nou și salvați-l în baza de date
* @param string $email Adresa de e-mail a utilizatorului
* @return Utilizator
*/

Creare funcție statică privată ($email)(

// Scrieți un utilizator nou în baza de date și returnați-l

$rezultat = ORM::for_table("reg_users")->create();
$rezultat->email = $email;
$rezultat->salvare();

Returnează utilizator nou ($rezultat);
}

/**
* Verificați dacă un astfel de utilizator există în baza de date și returnați un boolean.
* @param string $email Adresa de e-mail a utilizatorului
* @return boolean
*/

Funcția publică statică există ($email)(

// Există utilizatorul în baza de date?
$rezultat = ORM::for_table("reg_users")
->unde(„e-mail”, $e-mail)
->count();

Returnează $rezultat == 1;
}

/**
* Creați un nou obiect utilizator
* @param $param instanță ORM, id, e-mail sau null
* @return Utilizator
*/

Funcția publică __construct($param = null)(

Dacă($param instanță de ORM)(

// A fost trecută o instanță ORM
$this->orm = $param;
}
else if(este_șir($param))(

// A fost trimis un e-mail
$acest->
->unde(„e-mail”, $param)
->găsește_unul();
}
altceva(

Dacă(este_numeric($param))(
// Un ID de utilizator a fost transmis ca parametru
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Nu a fost transmis niciun ID de utilizator, priviți sesiune
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->unde(„id”, $id)
->găsește_unul();
}

/**
* Generează un nou token de autentificare SHA1, îl scrie în baza de date și îl returnează.
* @return șir
*/

Funcția publică generateToken())(
// generează un token pentru utilizatorul conectat. Salvați-l în baza de date.

$token = sha1($this->email.time().rand(0, 1000000));

// Salvați jetonul în baza de date,
// și marcați-l ca fiind valabil doar pentru următoarele 10 minute

$this->orm->set("token", $token);
$this->orm->set_expr("validitate_token", "ADDTIME(ACUM(),"0:10")");
$this->orm->save();

Returnează $token;
}

/**
*Conectează-te la acest utilizator
* @return nul
*/

Autentificare în funcție publică()

// Marcați utilizatorul ca autentificat
$_SESSION["loginid"] = $this->orm->id;

// Actualizați câmpul last_login db
$this->orm->set_expr("ultima_login", "ACUM()");
$this->orm->save();
}

/**
* Distrugeți sesiunea și deconectați utilizatorul.
* @return nul
*/

Deconectare funcție publică()
$_SESSION = matrice();
unset($_SESSION);
}

/**
* Verificați dacă utilizatorul este autentificat.
* @return boolean
*/

Funcție publică loggedIn())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Verificați dacă utilizatorul este administrator
* @return boolean
*/

Funcția publică este Admin())(
returnează $this->rank() == „administrator”;
}

/**
* Găsiți tipul de utilizator. Poate fi fie admin, fie obișnuit.
* @return șir
*/

Rangul funcției publice())(
if($this->orm->rank == 1)(
returnează „administrator”;
}

Reveniți „obișnuit”;
}

/**
* Metodă magică pentru accesarea elementelor private
* $orm instanță ca proprietăți ale obiectului utilizator
* @param șir $key Numele proprietății accesate
* @return mixt
*/

Funcția publică __get($key)(
if(isset($this->orm->$key))(
returnează $this->orm->$key;
}

Returnează nul;
}
}
Tokenurile sunt generate folosind un algoritm și stocate într-o bază de date. Folosim MySQL pentru a seta coloana token_validity la 10 minute. Când validăm un token, îi spunem motorului că avem nevoie de un token, câmpul token_validity nu a expirat încă. Astfel limităm timpul în care tokenul va fi valabil.

Observați că folosim metoda magică __get() la sfârșitul documentului pentru a accesa proprietățile obiectului utilizator. Acest lucru ne permite să accesăm datele care sunt stocate în baza de date ca proprietăți: $user->email, $user->token. Ca exemplu, să vedem cum putem folosi această clasă în următorul fragment de cod:


Un alt fișier care stochează funcționalitatea necesară este functions.php. Acolo avem câteva funcții de ajutor care ne permit să păstrăm restul codului mai ordonat.

Funcții.php

Funcția send_email($from, $to, $subject, $message)(

// Funcție de ajutor pentru trimiterea de e-mail

$headers = "Versiune MIME: 1.0" . „\r\n”;
$headers .= "Tip de conținut: text/plain; charset=utf-8" . „\r\n”;
$headers .= "De la: ".$de la . „\r\n”;

Returnează e-mail($către, $subiect, $mesaj, $anteturi);
}

funcția get_page_url())(

// Aflați adresa URL a unui fișier PHP

$url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://".$_SERVER["SERVER_NAME"];

If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
$url.= $_SERVER[„CERERE_URI”];
}
altceva(
$url.= $_SERVER[„CALEA_INFO”];
}

Returnează $url;
}

funcția rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)(

// Numărul de încercări de conectare pentru ultima oră de către această adresă IP

$count_hour = ORM::for_table("reg_login_tempt")
->
->where_raw("ts > SUBTIME(ACUM(),"1:00")")
->count();

// Numărul de încercări de conectare din ultimele 10 minute de către această adresă IP

$count_10_min = ORM::for_table("reg_login_tempt")
->unde ("ip", sprintf ("%u", ip2long($ip)))
->where_raw("ts > SUBTIME(ACUM(),"0:10")")
->count();

Dacă($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
throw new Exception ("Prea multe încercări de conectare!");
}
}

funcția rate_limit_tick($ip, $email)(

// Creați o înregistrare nouă în tabelul de încercări de conectare

$login_tempt = ORM::for_table("reg_login_tempt")->create();

$login_attempt->email = $email;
$login_tempt->ip = sprintf("%u", ip2long($ip));

$încercare_login->salvare();
}

redirecționare funcție($url)(
header("Locație: $url");
Ieșire;
}
Funcțiile rate_limit și rate_limit_tick ne permit să limităm numărul de încercări de autorizare pentru o anumită perioadă de timp. Încercările de autorizare sunt înregistrate în baza de date reg_login_attempt. Aceste funcții sunt declanșate atunci când formularul de conectare este verificat, după cum puteți vedea în următorul fragment de cod.

Codul de mai jos a fost preluat de pe index.php și este responsabil pentru validarea formularului de autentificare. Returnează un răspuns JSON care este condus de codul jQuery pe care l-am văzut în assets/js/script.js.

index.php

If(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))(

// Afișează un antet JSON

Antet ("Content-type: application/json");

// Adresa de e-mail este validă?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception(„Vă rugăm să introduceți un e-mail valid.”);
}

// Aceasta va arunca o excepție dacă persoana este deasupra
// limitele permise de încercare de conectare (consultați functions.php pentru mai multe):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Înregistrați această încercare de conectare
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["e-mail"]);

// Trimite mesajul utilizatorului

$mesaj = "";
$email = $_POST["e-mail"];
$subject = "Link-ul dvs. de conectare";

Dacă(!Utilizatorul::există($email))(
$subject = „Vă mulțumim pentru înregistrare!”;
$message = "Vă mulțumim pentru înregistrarea pe site-ul nostru!\n\n";
}

// Încercați să vă autentificați sau să înregistrați persoana
$user = Utilizator::loginOrRegister($_POST["e-mail"]);

$message.= „Puteți să vă conectați de la această adresă URL:\n”;
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Legătura va expira automat după 10 minute.";

$rezultat = send_email($fromEmail, $_POST["email"], $subject, $message);

Dacă(!$rezultat)(
throw new Exception ("A apărut o eroare la trimiterea e-mailului dvs. Vă rugăm să încercați din nou.");
}

Die(json_encode(array(
"message" => "Vă mulțumim! Am trimis un link către căsuța dvs. de e-mail. Verificați și folderul de spam.”
)));
}
}
catch(Excepție $e)(

Die(json_encode(array(
"eroare" => 1,
„message” => $e->getMessage()
)));
}
După autorizarea sau înregistrarea cu succes, codul de mai sus trimite un e-mail persoanei cu un link pentru autorizare. Tokenul este disponibil ca o variabilă $_GET „tkn” datorită adresei URL generate.

index.php

If(isset($_GET["tkn"]))(

// Este acesta un simbol de conectare valid?
$user = Utilizator::findByToken($_GET["tkn"]);

// Da! Conectați-vă utilizatorul și redirecționați către pagina protejată.

$user->login();
redirect("protected.php");
}

// Simbol Invalid. Redirecționați înapoi la formularul de conectare.
redirect("index.php");
}
Rularea $user->login() va crea variabilele de sesiune necesare, permițând utilizatorului să rămână conectat la conectările ulterioare.

Deconectarea din sistem este implementată aproximativ în același mod:

Index.php

If(isset($_GET["deconectare"]))(

$utilizator = utilizator nou();

Dacă($user->loggedIn())(
$user->logout();
}

Redirect("index.php");
}
La sfârșitul codului, redirecționăm utilizatorul către index.php din nou, astfel încât parametrul ?logout=1 din URL este eliminat.

Fișierul nostru index.php va avea nevoie și de protecție - nu dorim ca utilizatorii deja autentificați să vadă formularul. Pentru a face acest lucru, folosim metoda $user->loggedIn():

Index.php

$utilizator = utilizator nou();

if($user->loggedIn())(
redirect("protected.php");
}
În cele din urmă, să vedem cum vă puteți proteja pagina site-ului web și să o faceți accesibilă numai după autorizare:

protejat.php

// Pentru a proteja orice pagină php de pe site-ul dvs., includeți main.php
// și creează un nou obiect User. Este atat de simplu!

require_once "includes/main.php";

$utilizator = utilizator nou();

if(!$user->loggedIn())(
redirect("index.php");
}
După această verificare, puteți fi sigur că utilizatorul s-a conectat cu succes. De asemenea, veți avea acces la datele care sunt stocate în baza de date ca proprietăți ale obiectului $user. Pentru a afișa e-mailul utilizatorului și rangul acestuia, utilizați următorul cod:

Echo „E-mailul tău: „.$user->email;
echo "Rangul dvs.: ".$user->rank();
Aici rank() este metoda deoarece coloana de rang din baza de date conține de obicei numere (0 pentru utilizatorii obișnuiți și 1 pentru administratori) și trebuie să le convertim pe toate în nume de rang, care este implementat folosind această metodă. Pentru a converti un utilizator standard într-un administrator, pur și simplu editați intrarea utilizatorului în phpmyadmin (sau orice alt program de bază de date). În calitate de administrator, utilizatorului nu i se va acorda nicio capacitate specială. Dumneavoastră aveți dreptul de a alege ce drepturi să acordați administratorilor.

Gata!

Cu aceasta, sistemul nostru simplu de înregistrare este gata! Îl puteți utiliza pe un site PHP existent sau îl puteți moderniza pentru a se potrivi propriilor cerințe.

Instrucțiuni

Să organizăm cel mai simplu mod de a proteja paginile de vizitatorii neautorizați. Purtătorul de informații despre dacă vizitatorul va fi. O sesiune este un analog al unui cookie dintr-un browser, singura diferență fiind că acestea sunt create nu de noi, ci de pe server. Și sunt folosite pentru același lucru pentru care sunt folosite cookie-urile - pentru a stoca diverse informații despre noi în timp ce mergem la pagina unui site. Când închidem browserul, serverul distruge această sesiune, iar data viitoare când ne conectăm, creează una nouă. Folosim acest mecanism de server pentru a înregistra în sesiune dacă utilizatorul este deja autorizat sau nu. Citind aceste informații, atunci când un vizitator solicită o pagină, scriptul PHP fie va deschide accesul la paginile protejate cu parolă, fie vă va solicita să introduceți un login și o parolă.

Pasul 1: Creați o pagină pentru a introduce datele de conectare și . Codul HTML al formularului de autorizare în forma sa cea mai simplă poate arăta astfel:

Log in:

Parola:


Aici (la începutul fișierului) vom adăuga un cod PHP care va verifica corectitudinea numelui de utilizator și a parolei introduse de vizitator. La inceput scriem:
sesiune_start();
Această comandă începe o nouă sesiune dacă nu a fost deja creată una pentru acest vizitator.
Apoi vom verifica dacă sesiunea are o variabilă numită „userName” – va stoca numele dacă vizitatorul a fost deja autorizat. Dacă există o astfel de variabilă, vom redirecționa vizitatorul către pagina principală (index.php) și vom termina de executat acest script php:
if($_SESSION[„nume utilizator”])(

}
Toate celelalte coduri vor fi executate numai dacă utilizatorul nu a introdus încă login-ul și parola corecte. Să indicăm ce autentificare și parola ar trebui considerate corecte:
$validName = „Sunt al meu!”;


Apoi vom verifica dacă valorile trimise din formular sunt corecte. Deoarece am specificat metoda de transfer de date POST în formular, acestea ar trebui citite din variabila superglobală $_POST:

Antet("Locație: index.php");

}
Aici codul între acolade () va fi executat cu valorile corecte de autentificare și parolă. În linia $_SESSION["userName"] = $validName; Scriem o variabilă în sesiune cu numele „userName” care conține login-ul utilizatorului acum autorizat. Acesta va fi un semn care indică faptul că are acces peste tot atâta timp cât sesiunea sa actuală este valabilă.
Și în cazul în care sunt introduse date incorecte în formular, vom adăuga mesajul corespunzător:
altfel ecou"
Autentificarea sau parola este incorectă!
";
Tot codul care trebuie salvat într-un fișier numit login.php va arăta astfel:

sesiune_start();
if($_SESSION[„nume utilizator”])(

Antet("Locație: index.php");

}
$validName = „Sunt al meu!”;

$validPass = "parolă secretă";
if($_POST["userName"] == $validName && $_POST["userPass"] == $validPass) (

$_SESSION["userName"] = $validName;

Antet("Locație: index.php");

altfel ecou"
Autentificarea sau parola este incorectă!
";

Log in:

Parola:

Pasul 2: Creați un bloc de autorizare - un fișier separat care va fi conectat la fiecare pagină care necesită protecție prin parolă. Acest fișier va conține doar cod PHP, deci extensia sa va fi „php”, iar noi îi vom da un nume conform tradiției pentru astfel de fișiere - „auth”, adică „auth.php”. Și aici, imediat după eticheta de deschideresesiune_start();
Putem citi toate variabilele care sunt stocate în sesiune din tabloul superglobal $_SESSION. Trebuie să verificăm valoarea variabilei „userName” - dacă vizitatorul nu s-a conectat încă, atunci nu va fi în matrice și îl vom redirecționa către pagina pentru introducerea numelui de autentificare și a parolei:
dacă(!$_SESSION[„autorizat”])(

Antet("Locație: login.php");

sesiune_start();
dacă(!$_SESSION[„admin”])(

Antet("Locație: enter.php");

Dacă trebuie să faceți una dintre secțiunile site-ului dvs. accesibilă unui cerc limitat, dar nedefinit de persoane, cel mai simplu mod de a face acest lucru este înregistrarea și autorizarea utilizatorilor. Există multe modalități de a autoriza utilizatorii. Puteți utiliza atât instrumentele serverului web, cât și instrumentele limbajului de programare. Vom vorbi despre cazul în care se folosesc sesiuni PHP.

Mai întâi, să discutăm despre toți pașii pe care îi vom face în continuare. De ce avem nevoie? Avem nevoie de un script care să înregistreze utilizatorul, să îl autorizeze, să îl redirecționeze undeva după autorizare. De asemenea, va trebui să creăm o pagină care va fi protejată împotriva accesului de către utilizatori neautorizați. Pentru înregistrare și autorizare, va trebui să creăm formulare HTML. Vom stoca informații despre utilizatorii înregistrați într-o bază de date. Aceasta înseamnă că mai avem nevoie de un script pentru conectarea la DBMS. Toată munca noastră va fi făcută de funcții pe care le scriem noi înșine. Vom salva aceste funcții într-un fișier separat.

Deci, avem nevoie de următoarele fișiere:

  • conexiune la SGBD;
  • funcții personalizate;
  • autorizare;
  • înregistrare;
  • pagina protejata;
  • script de oprire a utilizatorului;
  • un script care verifică starea de autorizare a utilizatorului;
  • foaie de stil pentru cel mai simplu design al paginilor noastre.

Toate acestea vor fi lipsite de sens dacă nu aveți un tabel corespunzător în baza de date. Lansați instrumentul dvs. de management DBMS (PhpMyAdmin sau linia de comandă, oricare dintre acestea este mai convenabilă) și executați următoarea interogare în el:

CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT, `login` char(16) NOT NULL, `parola` char(40) NOT NULL, `reg_date` timestamp NU NULL DEFAULT CURRENT_TIMESTAMP, CHEIE PRIMARĂ (` id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Voi denumi fișierele noastre script astfel (vor fi toate într-un singur director):

  • baza de date.php;
  • funcții.php;
  • login.php;
  • înregistrare.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • stil.css.

Scopul fiecăruia dintre ei, sunt sigur, vă este clar. Să începem cu scriptul de conectare la SGBD. L-ai văzut deja. Doar salvați codul pentru acest script într-un fișier numit database.php. Vom declara funcții personalizate în fișierul functions.php. Cum vor funcționa toate acestea? Un utilizator neautorizat încearcă să acceseze un document protejat index.php, sistemul verifică dacă utilizatorul este autorizat, dacă utilizatorul nu este autorizat, este redirecționat către pagina de autorizare. Pe pagina de conectare, utilizatorul ar trebui să vadă un formular de autorizare. Hai să o facem.

Autorizarea utilizatorului

Inregistreaza-te.

Acum, formularul nostru trebuie să primească o formă. În același timp, vom defini reguli pentru alte elemente. Privind în viitor, voi prezenta în întregime conținutul foii de stil.

/* fișier style.css */ .row ( margin-bottom:10px; width:220px; ) .row etichetă ( display:block; font-weight:bold; ) .row input.text ( font-size:1.2em; padding:2px 5px; .to_reg (font-size:0.9em; ) .instruction (font-size:0.8em; color:#aaaaaa; margin-left:2px; cursor:default; ) .error (color:red; margine-stânga:3px)

Dacă totul este făcut corect, ar trebui să aveți următoarele în browser:

Desigur, nu avem încă un singur utilizator înregistrat și, pentru a vă autentifica, trebuie să vă înregistrați. Să facem un formular de înregistrare.

Înregistrare utilizator

" />

Probabil ați observat că există variabile PHP în codul HTML. Sunt conținutul atributelor câmpurilor text ale formularelor, conținutul containerelor concepute pentru a afișa erori. Dar nu am inițializat aceste variabile. Hai să facem asta.

Înregistrare utilizator

" />
Numele de utilizator poate conține doar caractere latine, numere și simbolurile „_”, „-”, „.”. Numele de utilizator nu trebuie să fie mai scurt de 4 caractere și să nu depășească 16 caractere
În parola dvs., puteți utiliza doar caractere latine, numere și simbolurile „_”, „!”, „(”, „)”. Parola nu trebuie să fie mai scurtă de 6 caractere și să nu depășească 16 caractere
Repetați parola introdusă anterior

Nu există niciun parametru specificat în atributul de acțiune al etichetei formular. În acest caz, la trimiterea datelor din formular, acestea vor fi prelucrate în același script din care au fost trimise. Aceasta înseamnă că trebuie să scriem cod care procesează datele din formular. Dar să discutăm mai întâi despre algoritmul pentru procesarea lor.

Avem nevoie ca câmpurile de autentificare și parolă să nu fie goale. Apoi, trebuie să verificați autentificarea pentru conformitatea cu cerințele. Parola trebuie să îndeplinească și cerințele descrise, iar parola respecificată trebuie să se potrivească cu ea și, în plus, trebuie să fie identice. Dacă oricare dintre aceste condiții nu este îndeplinită, procesarea datelor din formular trebuie să se oprească, o alertă adecvată trebuie să fie scrisă în tabloul de mesaje de eroare și trebuie să fie afișată utilizatorului. Pentru comoditatea utilizatorului, vom salva login-ul pe care a introdus-o (dacă a specificat-o) scriind valoarea acesteia în tabloul $fields.

Dacă totul este în regulă, în fereastra browserului dvs., când accesați documentul registration.php, ar trebui să vedeți ceva de genul:

Acum, să presupunem că utilizatorul a făcut clic pe butonul de înregistrare și nu a completat câmpurile din formular. Conform algoritmului nostru, autentificarea și parola nu pot fi goale. Dacă această condiție nu este îndeplinită, înregistrarea nu este posibilă. Retinem ca prelucrarea datelor din formular are loc in scenariul actual. Aceasta înseamnă că trebuie să îi schimbăm codul adăugând verificări corespunzătoare. Să discutăm imediat despre următoarele verificări. Dacă ați introdus atât un login, cât și o parolă, trebuie să verificați conformitatea acestora cu cerințele specificate. Pentru a verifica autentificarea și parola, vom crea funcții personalizate în fișierul functions.php.

/** * functions.php * Fișier cu funcții personalizate */ // Conectați fișierul cu parametrii de conectare la DBMS require_once("database.php"); // Verificarea funcției nume de utilizator checkLogin($str) ( // Inițializează o variabilă cu un posibil mesaj de eroare $error = ""; // Dacă lipsește linia de conectare, returnează un mesaj de eroare if(!$str) ( $error = " Nu ați introdus un nume de utilizator" return $error ) /** * Verificați numele de utilizator folosind expresii obișnuite. numere, * poate conține caracterele "_", "-", "." */ $pattern = "/^[-_.a-z\d](4,16)$/i"; ($pattern, $str) ; // Dacă verificarea eșuează, returnează un mesaj de eroare if(!$result) ( $error = "Caractere nevalide în numele de utilizator sau numele de utilizator este prea scurt (lung)"; return $error; ) // Dacă totul este bine, returnează valoarea true return true ) // Verificarea funcției de parolă a utilizatorului checkPassword($str) ( // Inițializează o variabilă cu un posibil mesaj de eroare $error = ""; // Dacă există nicio linie de autentificare, returnează un mesaj de eroare if(!$ str) ( $error = "Nu ați introdus o parolă";

returnează $eroare;

V-ați înregistrat cu succes în sistem. Acum veți fi redirecționat către pagina de conectare. Dacă acest lucru nu se întâmplă, accesați-l folosind linkul direct.

"; header("Refresh: 5; URL = login.php"); ) // În caz contrar, informați utilizatorul despre eroare altfel ( $errors["full_error"] = $reg; ) ) ) ?> Înregistrare utilizator
" />
Numele de utilizator poate conține doar caractere latine, numere și simbolurile „_”, „-”, „.”. Numele de utilizator nu trebuie să fie mai scurt de 4 caractere și să nu depășească 16 caractere
În parola dvs., puteți utiliza doar caractere latine, numere și simbolurile „_”, „!”, „(”, „)”. Parola nu trebuie să fie mai scurtă de 6 caractere și să nu depășească 16 caractere
Repetați parola introdusă anterior

Ar fi trebuit să observați o altă funcție nouă în script-registration() . Dar nu am anunțat încă. Hai să facem asta.

// Funcția de înregistrare a utilizatorului funcția înregistrare($login, $parolă) ( // Inițializează o variabilă cu un posibil mesaj de eroare $error = ""; // Dacă nu există o linie de conectare, returnează un mesaj de eroare dacă(!$login) ( $ eroare = „Nu a fost specificată nicio autentificare”; return $error; ) elseif(!$parolă) ( $error = „Nu a fost specificată nicio parolă”; return $error; ) // Verificați dacă utilizatorul este deja înregistrat // Conectați-vă la DBMS connect() ; // Scrieți un șir de interogare $sql = "SELECT `id` FROM `users` WHERE `login`="" . $login . """ // Faceți o interogare la baza de date $query = mysql_query( $sql) sau die( "" // Uită-te la numărul de utilizatori cu această autentificare, dacă există cel puțin unul, // returnează un mesaj de eroare if(mysql_num_rows($query) > 0) ( $error = "); Utilizatorul cu datele de conectare specificate este deja înregistrat"; returnează eroare $; ) // Dacă nu există un astfel de utilizator, înregistrați-l // Scrieți șirul de interogare $sql = "INSERT INTO `users` (`id`,`login`) ,`parolă`) VALORI (NULL, "" . $login . " ","" . $parolă. "")"; // Faceți o interogare la baza de date $query = mysql_query($sql) sau die("

Nu se poate adăuga utilizatorul: " . mysql_error() . ". A apărut o eroare la linia „ . __LINE__ ”.

"); // Nu uitați să vă deconectați de la DBMS mysql_close(); // Returnați valoarea true, indicând înregistrarea cu succes a utilizatorului return true; )

Dacă totul este în regulă, utilizatorul dvs. va fi înregistrat. Puteți testa formularul. Încercați să înregistrați utilizatori cu aceleași date de conectare. După înregistrarea cu succes, utilizatorul va fi redirecționat către formularul de autorizare. Anterior, am creat pur și simplu marcajul pentru a afișa acest formular. Deoarece nu există niciun parametru specificat în atributul său de acțiune, datele transmise prin formular vor fi procesate în același script. Aceasta înseamnă că trebuie să scriem cod pentru procesare și să-l adăugăm în documentul login.php.

Autorizarea utilizatorului

;">

Dacă nu sunteți înregistrat în sistem, înregistrați-vă.

Probabil ați observat că în scriptul de autorizare avem acum o altă funcție necunoscută - authorization() . Această funcție trebuie să autorizeze utilizatorul verificând mai întâi dacă în baza de date există un utilizator înregistrat cu aceeași autentificare și parolă. Dacă un astfel de utilizator nu este găsit, autorizarea va fi anulată și va fi afișat un mesaj de eroare. Dacă verificarea are succes, funcția de autorizare() va lansa o sesiune și va scrie în ea valorile de conectare și parole ale utilizatorului, va informa scriptul că autorizarea a avut succes, iar scriptul va redirecționa utilizatorul către o pagină de resursă protejată.

/** * Funcția de autorizare a utilizatorului.

* Autorizarea utilizatorului va fi efectuată * folosind sesiuni PHP.

*/ Autorizarea funcției($login, $parolă) ( // Inițializează o variabilă cu un posibil mesaj de eroare $error = ""; // Dacă nu există o linie de conectare, returnează un mesaj de eroare dacă(!$login) ( $eroare = " Autentificare nu este specificată"; returnează $error; elseif(!$parolă) ( $error = "Parola nu este specificată"; returnează $error; ) // Verificați dacă utilizatorul este deja înregistrat // Conectați-vă la DBMS ); // Trebuie să verificăm dacă un astfel de utilizator este printre cei înregistrați // Compuneți un șir de interogare $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND ` parola`="".$parolă ."""; // Executați interogarea $query = mysql_query($sql) sau die("

Nu se poate executa interogarea: ". mysql_error() . ". A apărut o eroare la linia „ . __LINE__ ”.

Funcția checkAuth($login, $parolă) ( // Dacă nu există autentificare sau parolă, returnează false dacă (!$login || !$parolă) returnează false; // Verificați dacă un astfel de utilizator este înregistrat // Conectați-vă la DBMS connect(); // Compune șirul de interogare $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND `parola`="".$parolă.""" // Executăm interogarea $ interogare = mysql_query($sql) sau die("

* Autorizarea utilizatorului va fi efectuată * folosind sesiuni PHP.

"); // Dacă nu există niciun utilizator cu astfel de date, returnează false; if(mysql_num_rows($query) == 0) ( return false; ) // Nu uitați să închideți conexiunea la baza de date mysql_close(); // În caz contrar returnează true return true)

Acum că utilizatorul a ajuns la pagina protejată, trebuie să apelăm funcția pentru a verifica datele de autorizare. Vom plasa scriptul de apel și verificare într-un fișier checkAuth.php separat și îl vom conecta la acele pagini care vor fi închise accesului public.

/** * Script pentru verificarea autorizației utilizatorului */ // Porniți o sesiune din care vom extrage login-ul și parola // utilizatorilor autorizați session_start(); // Conectați un fișier cu funcții personalizate require_once("functions.php"); /** * Pentru a determina dacă un utilizator este autorizat, trebuie * să verificăm dacă există înregistrări în baza de date pentru login * și parola lui. Pentru a face acest lucru, vom folosi funcția personalizată * pentru a verifica corectitudinea datelor utilizatorului conectat.

* Dacă această funcție returnează false, atunci nu există autorizare.

* Dacă nu există autorizare, pur și simplu redirecționăm * utilizatorul către pagina de autorizare.

*/ // Dacă sesiunea conține atât date de conectare, cât și date de parolă, // verificați-le if(isset($_SESSION["login"]) && $_SESSION["login"] && isset($_SESSION["parola" ]) && $_SESSION["parolă"]) ( // Dacă verificarea datelor existente eșuează dacă(!checkAuth($_SESSION["login"], $_SESSION["parolă"]))) ( // Redirecționează utilizatorul către antetul paginii de conectare( "location: login.php"); // Opriți executarea scriptului de ieșire ) ) // Dacă nu există date despre autentificarea sau parola utilizatorului, // presupunem că nu există autorizație, redirecționăm utilizatorul // către autorizare pagina else ( header("location: login.php"); // Opriți executarea scriptului de ieșire;

Acum să creăm codul pentru pagina noastră securizată. Va fi destul de simplu.

După cum puteți vedea, într-un document protejat includem un singur fișier - checkAuth.php. Toate celelalte fișiere sunt conectate în alte scripturi. Prin urmare, codul nostru nu pare greoi. Am organizat înregistrarea și autorizarea utilizatorilor. Acum trebuie să permiteți utilizatorilor să se deconecteze. Pentru a face acest lucru, vom crea un script în fișierul logout.php.

/** * Script de deconectare a utilizatorului. Deoarece utilizatorii * se conectează prin sesiuni, autentificarea și parola lor sunt stocate * în matricea superglobală $_SESSION. Pentru a * deconecta din sistem, pur și simplu distrugeți valorile * ale matricei $_SESSION["login"] și $_SESSION["parolă"], după care * redirecționăm utilizatorul către pagina de conectare */ // Fi sigur că începeți sesiunea session_start(); unset($_SESSION["login"]); unset($_SESSION["parolă"]); header("locație: login.php");

Scriptul de înregistrare, autorizare și verificare a utilizatorului este gata. Îl poți folosi pentru tine, îl poți suplimenta, îl poți schimba în funcție de nevoile tale. Dacă aveți întrebări, le puteți adresa în comentarii. Puteți descărca toate fișierele discutate aici, împachetate într-o singură arhivă.

P.S. Știu că este mai bine să scrieți cod orientat pe obiecte, știu că nu merită transmiterea și stocarea unei parole în text clar, că informațiile introduse în baza de date trebuie verificate în prealabil. Știu. Nu voi vorbi despre asta aici.