Kako podesiti pametne telefone i računare. Informativni portal

Php mysql sistem autorizacije. Kreiramo neverovatno jednostavan sistem registracije u PHP i MySQL

Instrukcije

Organizirajmo najlakši način zaštite vaših stranica od neovlaštenih posjetitelja. Nosilac informacije o tome da li će posjetilac biti. Sesija je analogni kolačićima u pretraživaču, sa jedinom razlikom što se kreiraju ne na našem serveru, već na serveru. I oni se koriste u istu svrhu kao i kolačići - da pohrane različite informacije o nama dok idemo na stranicu jedne stranice. Kada zatvorimo pretraživač, server uništava ovu sesiju, a kada se sljedeći put prijavimo, kreira novu. Koristimo ovaj serverski mehanizam da zabilježimo da li je korisnik već prijavljen na sesiju ili ne. Čitajući ove informacije, kada posjetitelj zatraži stranicu, php skripta će ili otvoriti pristup stranicama zaštićenim lozinkom, ili ponuditi unošenje korisničkog imena i lozinke.

Korak 1: Kreirajte stranicu za prijavu i. HTML kod formulara za autorizaciju u svom najjednostavnijem obliku može izgledati ovako:

Ulogovati se:

Lozinka:


Ovdje (na samom početku fajla) ćemo dodati php-kod koji će provjeriti ispravnost korisničkog imena i lozinke koje je unio posjetitelj. Na početku ćemo napisati:
session_start ();
Ova komanda pokreće novu sesiju ako ona već nije kreirana za ovog posjetitelja.
Zatim provjerimo da li sesija ima varijablu pod nazivom "userName" - ona će pohraniti ime ako je posjetitelj već autoriziran. Ako postoji takva varijabla, preusmjerite posjetitelja na glavnu stranicu (index.php) i završite izvršavanje ove php skripte:
if ($ _ SESSION ["userName"]) (

}
Ostatak koda će se izvršiti samo ako korisnik još nije unio ispravno korisničko ime i lozinku. Naznačimo koju prijavu i lozinku treba smatrati ispravnim:
$ validName = "Ja sam moj!";


Zatim provjeravamo da li se vrijednosti dostavljene iz obrasca podudaraju s ispravnim. Pošto smo naveli POST metod prijenosa podataka u obrascu, oni bi trebali biti pročitani iz superglobalne varijable $_POST:

Zaglavlje ("Lokacija: index.php");

}
Ovdje će se kod u vitičastim zagradama () izvršiti s ispravnim vrijednostima za prijavu i lozinku. U redu $_SESSION ["userName"] = $ validName; ma upišemo u sesiju varijablu pod nazivom "userName" koja sadrži prijavu sada ovlaštene osobe. Ovo će biti oznaka da je pristup njemu svuda sve dok je njegova trenutna sesija važeća.
A u slučaju da se u formular unesu netačni podaci, dodajte odgovarajuću poruku:
inače odjek"
Prijava ili lozinka je netačna!
";
Sav kod koji treba da bude sačuvan u fajlu pod nazivom login.php će izgledati ovako:

session_start ();
if ($ _ SESSION ["userName"]) (

Zaglavlje ("Lokacija: index.php");

}
$ validName = "Ja sam moj!";

$ validPass = "tajna lozinka";
if ($ _ POST ["userName"] == $ validName && $ _POST ["userPass"] == $ validPass) (

$ _SESSION ["userName"] = $ validName;

Zaglavlje ("Lokacija: index.php");

inače odjek"
Prijava ili lozinka je netačna!
";

Ulogovati se:

Lozinka:

Korak 2: Kreirajte autorizacijski blok - zasebnu datoteku koja će biti povezana sa svakom stranicom kojoj je potrebna zaštita lozinkom. Ovaj fajl će sadržati samo php-kod, pa će mu ekstenzija biti "php", a mi ćemo mu dati ime po tradiciji za takve fajlove - "auth", odnosno "auth.php". I ovdje, odmah nakon uvodne oznakesession_start ();
Možemo pročitati sve varijable koje su pohranjene u sesiji iz superglobalnog niza $_SESSION. Moramo provjeriti vrijednost varijable "userName" - ako se posjetitelj još nije prijavio, onda neće biti u nizu, a mi ćemo ga preusmjeriti na stranicu za unos korisničkog imena i lozinke:
ako (! $ _ SESSION ["ovlašteno"]) (

Zaglavlje ("Lokacija: login.php");

session_start ();
if (! $ _ SESSION ["admin"]) (

Zaglavlje ("Lokacija: enter.php");

Reg.ru: domeni i hosting

Najveći registrator i hosting provajder u Rusiji.

Više od 2 miliona imena domena u upotrebi.

Promocija, mail za domen, poslovna rješenja.

Više od 700 hiljada kupaca širom svijeta već je odlučilo.

* Zadržite pokazivač miša da pauzirate pomicanje.

Nazad naprijed

Kreiranje jednostavnog sistema registracije korisnika u PHP i MySQL

Postavljanje sistema registracije je dosta posla. Morate napisati kod koji potvrđuje adrese e-pošte, šalje e-poštu za potvrdu registracije, potvrđuje ostala polja obrasca i još mnogo toga.

A i nakon što sve ovo napišete, korisnici će nerado da se registruju, jer to zahtijeva određeni napor sa njihove strane.

U ovom vodiču ćemo kreirati vrlo jednostavan sistem registracije koji uopće ne zahtijeva niti pohranjuje lozinke! Rezultat će biti lako modificirati i dodati postojećoj PHP stranici. Želite li saznati kako funkcionira? Pročitajte u nastavku.



Ovako će funkcionirati naš super jednostavan sistem:

Kombinovaćemo obrazac za prijavu i registraciju. Ovaj obrazac će imati polje za unos adrese e-pošte i dugme za registraciju;
- Prilikom popunjavanja polja sa email adresom, klikom na dugme za registraciju kreiraće se zapis o novom korisniku, ali samo ako unesena adresa e-pošte nije pronađena u bazi.

Nakon toga se kreira određeni nasumični jedinstveni skup simbola (token) koji se šalje na poštu koju je korisnik odredio u obliku veze koja će biti relevantna 10 minuta;
- Korisnik prati link na našu web stranicu. Sistem utvrđuje prisustvo tokena i ovlašćuje korisnika;

Prednosti ovog pristupa:

Nema potrebe za pohranjivanjem lozinki i provjerom valjanosti polja;
- Nema potrebe za vraćanjem lozinke, sigurnosnim pitanjima itd.;
- Od trenutka kada je korisnik registrovan/autorizovan, uvek možete biti sigurni da će ovaj korisnik biti u vašoj pristupnoj zoni (da je adresa e-pošte tačna);
- Nevjerovatno jednostavan proces registracije;

Nedostaci:

Sigurnost korisničkog naloga. Ako neko ima pristup korisničkoj pošti, može se prijaviti.
- E-pošta nije sigurna i može se presresti. Imajte na umu da je ovo pitanje relevantno iu slučaju kada je lozinka zaboravljena i treba je vratiti, ili u bilo kojem sistemu autorizacije koji ne koristi HTTPS za prijenos podataka (login/lozinka);
- Dok ne konfigurišete mail server po potrebi, postoji šansa da poruke sa linkovima za autorizaciju završe u neželjenoj pošti;

Upoređujući prednosti i nedostatke našeg sistema, možemo reći da sistem ima visoku upotrebljivost (najpogodniji za krajnjeg korisnika) i da istovremeno ima nizak indikator sigurnosti.

Stoga se preporučuje da se koristi za registracije na forumima i servisima koji ne rade sa važnim informacijama.

Kako koristiti ovaj sistem

U slučaju kada samo trebate koristiti sistem za autorizaciju korisnika na svojoj web stranici, a ne želite da rastavljate ovu lekciju, evo šta trebate učiniti:

Morate preuzeti izvore priložene lekciji
- Pronađite datoteku u arhivi tables.sql Uvezite ga u svoju bazu podataka koristeći opciju uvoza u phpMyAdmin. Alternativni način: otvorite ovu datoteku u uređivaču teksta, kopirajte SQL upit i izvršite ga;
- Otvori uključuje / main.php i ispunite postavke za povezivanje sa vašom bazom podataka (navedite korisnika i lozinku za povezivanje na bazu, kao i host i naziv baze podataka). U istoj datoteci morate navesti i adresu e-pošte koja će se koristiti kao originalna adresa za poruke koje sistem šalje. Neki domaćini blokiraju odlazne e-poruke sve dok se ne navede prava adresa e-pošte u obrascu, koji je kreiran sa kontrolne table domaćina, pa unesite pravu adresu;
- Preuzmite sve datoteke index.php, protected.php i sredstva i uključuje foldere preko FTP-a do vašeg hosta;
- Dodajte kod u nastavku na svaku PHP stranicu na kojoj želite da prikažete obrazac za autorizaciju;

Require_once "includes / main.php"; $ korisnik = novi korisnik (); if (! $ user- & gtloggedIn ()) (preusmjeravanje ("index.php");)
- Spreman!

Za one koje zanima kako sve to funkcionira - naprijed čitanje u nastavku!

Prvi korak je pisanje HTM koda obrasca za autorizaciju. Ovaj kod se nalazi u datoteci index.php... Ova datoteka također sadrži PHP kod koji obrađuje podatke obrazaca i druge korisne funkcije sistema autorizacije. Možete saznati više o tome u odjeljku Pregled PHP koda ispod.

index.php

Vodič: Super jednostavan sistem registracije sa PHP i MySQL

Prijavite se ili registrirajte

Unesite svoju email adresu iznad i mi ćemo poslati
imate link za prijavu.

U odeljku za glavu (između oznaka i) Uključio sam glavne stilove (u ovoj lekciji oni se ne razumiju, tako da ih možete sami vidjeti. folder Asset / css / style.css). Prije završne oznake Uključio sam jQuery biblioteku i datoteku script.js, koju ćemo napisati i analizirati u nastavku.


JavaScript

jQuery prati stanje dugmeta Registracija / Prijava pomoću funkcije e.preventDefault () i šalje AJAX zahtjeve. U zavisnosti od odgovora servera, prikazuje određenu poruku i određuje dalje radnje /

sredstva / js / script.js

$ (funkcija () (var form = $ ("# login-register"); form.on ("submit", funkcija (e) (if (form.is (". loading, .loggedIn")) (vrati false ;) var email = form.find ("ulaz"). val (), messageHolder = form.find ("span"); e.preventDefault (); $ .post (ova.akcija, (e-pošta: email), funkcija (m) (if (m.error) (form.addClass ("error"); messageHolder.text (m.message);) else (form.removeClass ("error"). addClass ("loggedIn"); messageHolder. tekst (m.message);)));)); $ (dokument) .ajaxStart (funkcija () (form.addClass ("učitavanje");)); $ (dokument) .ajaxComplete (funkcija () (form. removeClass ("učitavanje");));));

je dodan u obrazac za prikaz trenutnog stanja AJAX zahtjeva (što je omogućeno metodama ajaxStart ()) i ajaxComplete () koju možete pronaći pri kraju datoteke).

Ova klasa prikazuje vrteću animiranu gif datoteku (kao da nam nagoveštava da se zahtev obrađuje), a takođe deluje i kao zastavica koja sprečava ponovno slanje obrasca (kada je dugme za registraciju već jednom pritisnuto). Klasa .prijavljeni- ovo je druga zastavica - postavljena kada je email poslat. Ova zastavica trenutno blokira sve daljnje radnje sa formom.

Šema baze podataka

Naš neverovatno jednostavan sistem evidentiranja koristi 2 MySQL tabele (SQL je u datoteci tables.sql). Prvi pohranjuje podatke o korisničkim nalozima. Drugi pohranjuje informacije o broju pokušaja prijave.


Šema tablice korisnika.

Sistem ne koristi lozinke, kao što se može vidjeti na dijagramu. Također možete vidjeti stupac na njemu token sa tokenima uz kolonu token_validity... Token se instalira čim se korisnik poveže na sistem, postavi svoju e-poštu za slanje poruke (više o tome u sljedećem bloku). Zvučnik token_validity postavlja vrijeme 10 minuta kasnije, nakon čega token više nije važeći.


Shema tablice koja broji broj pokušaja autorizacije.

U obje tabele, IP adresa je pohranjena u raščlanjenom obliku pomoću funkcije ip2long u cijelobrojnom polju.

Sada možemo napisati neki PHP kod. Glavna funkcionalnost sistema je dodijeljena klasi User.class.php koje možete vidjeti u nastavku.

Ova klasa u velikoj meri koristi idorm (docs), ove biblioteke su minimalno potrebni alati za rad sa bazama podataka. On se bavi pristupom bazi podataka, generisanjem tokena i validacijom. Pruža jednostavan interfejs za jednostavno povezivanje sistema registracije sa vašom veb lokacijom ako koristi PHP.

User.class.php

Korisnik klase (// Private ORM case private $ orm; / ** * Pronađi korisnika po tokenu. Samo važeći tokeni se prihvataju na razmatranje. Token se generiše samo 10 minuta od trenutka kada je kreiran * @param string $ token . Ovo je željeni token * @return User. Vrati vrijednost korisničke funkcije * / javna statička funkcija findByToken ($ token) (// pronađite token u bazi podataka i provjerite da li je postavljena ispravna vremenska oznaka $ rezultat = ORM :: for_table ("reg_users") -> where ("token", $ token) -> where_raw ("token_validity> SADA ()") -> find_one (); if (! $ rezultat) (vrati false; ) vrati novog korisnika ($ rezultat);) / ** * Ovlasti ili registriraj korisnika * @param string $ email Prilagođena email adresa * @return Korisnik * / javna statička funkcija loginOrRegister ($ email) (// Ako je takav korisnik već postoji, vrati vrijednost funkcije User sa navedene adrese e-pošte pohranjene u bazi ako (Korisnik :: postoji ($ email)) (vrati novog korisnika ($ email);) // U suprotnom, kreiraj novog korisnika tijelo u bazi podataka i vrati vrijednost funkcije User :: create iz specificirane e-pošte vrati User :: create ($ email); ) / ** * Kreirajte novog korisnika i sačuvajte u bazi podataka * @param string $ email. Prilagođena adresa e-pošte * @return User * / privatna statička funkcija kreiranje ($ email) (// Napišite novog korisnika i vratite rezultat funkcije User iz ovih vrijednosti $ result = ORM :: for_table ("reg_users") - > kreiraj (); $ rezultat-> email = $ email; $ rezultat-> sačuvaj (); vrati novog korisnika ($ rezultat);) / ** * Provjerite postoji li takav korisnik u bazi podataka i vrati booleovu vrijednost varijabla * @param string $ email. Prilagođena adresa e-pošte * @return boolean * / javna statička funkcija postoji ($ email) (// Da li korisnik postoji u bazi podataka? $ Rezultat = ORM :: for_table ("reg_users") -> gdje ("e-pošta", $ email ) -> count (); return $ result == 1;) / ** * Kreirajte novi prilagođeni objekt * @param instanca $ param ORM, id, email ili 0 * @return Korisnik * / javna funkcija __construct ($ param = null) (if ($ param instanceof ORM) (// ORM provjera je prošla $ this-> orm = $ param;) else if (is_string ($ param)) (// Provjera e-pošte je prošla $ this-> orm = ORM :: for_table ("reg_users") -> where ("email", $ param) -> find_one ();) else ($ id = 0; if (is_numeric ($ param)) (// vrijednost $ param $ id varijabla se prosljeđuje korisničkom ID-u = $ param;) else if (isset ($ _ SESSION ["loginid"])) (// U suprotnom gledaj sesiju $ id = $ _SESSION ["loginid"];) $ this-> orm. = ORM :: for_table ( "reg_users") -> where ("id", $ id) -> find_one ();)) / ** * Generiraj novi SHA1 token autorizacije, piše na bazu i vraća njenu vrijednost * @return string * / javna funkcija generateToken () (// Generiši token za ovlaštenog korisnika i spremi ga u bazu $ token = sha1 ($ this-> email.time (). rand (0, 1000000 )); // Sačuvajte token u bazi podataka // I označite ga kao važeći samo sljedećih 10 minuta $ this-> orm-> set ("token", $ token); $ this-> orm-> set_expr ("token_validity", "ADDTIME (SADA ()," 0:10 ")"); $ ovo-> orm-> sačuvaj (); vratiti token $; ) / ** * Ovlastite korisnika * @return void * / javna funkcija za prijavu () (// Označite korisnika kao ovlaštenog $ _SESSION ["loginid"] = $ this-> orm-> id; // Ažurirajte vrijednost osnovno polje last_login $ this-> orm-> set_expr ("last_login", "SADA ()"); $ this-> orm-> save ();) / ** * Uništi sesiju i odjavi se korisnika * @ return void * / javna funkcija odjava () ($ _SESSION = array (); unset ($ _ SESSION);) / ** * Provjerite je li korisnik prijavljen * @return boolean * / javna funkcija loggedIn () (return isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;) / ** * Provjerite da li je korisnik administrator * @return boolean * / javna funkcija jeAdmin () (return $ this-> rank () = = "administrator";) / ** * Pronađite tip korisnika, može biti ili administrator ili običan * @return string * / javna funkcija rang () (ako ($ this -> orm-> rang == 1) (vrati "administrator";) vrati" regularno ";) / ** * Metoda za dobijanje privatnih informacija korisničko ime kao * svojstva objekta User * @param string $ ključ Naziv svojstva kojem se pristupa * @return miješano * / javna funkcija __get ($ ključ) (if (isset ($ this-> orm -> $ ključ)) ( vrati $ this -> orm -> $ ključ; ) vrati null; ))

Tokeni se generiraju pomoću SHA1 algoritma i pohranjuju u bazu podataka. Koristim MySQL funkcije za mjerenje vremena da postavim ograničenje isteka tokena od 10 minuta.

Kada token prođe proceduru validacije, direktno govorimo rukovaocu da razmatramo samo tokene koji još nisu istekli, pohranjene u stupcu token_validity.

Imajte na umu da koristim magičnu metodu __get biblioteku dokumenata na kraju datoteke da presretne svojstva objekta User.

Zahvaljujući tome, postaje moguć pristup informacijama pohranjenim u bazi podataka, zahvaljujući svojstvima $ user-> email, $ user-> token i dr. U sljedećem isječku koda razmotrićemo, na primjer, kako koristiti ove klase.


Zaštićena stranica

Još jedna datoteka koja pohranjuje korisnu i potrebnu funkcionalnost je datoteka functions.php... Ovdje postoji nekoliko takozvanih pomoćnika - pomoćnih funkcija koje vam omogućavaju da kreirate čišći i čitljiviji kod u drugim datotekama.

functions.php

Funkcija send_email ($ from, $ to, $ subject, $ message) (// Pomoćnik šalje email $ headers = "MIME-verzija: 1.0". "\ R \ n"; $ headers. = "Tip sadržaja: tekst / običan; charset = utf-8 "." \ r \ n "; $ headers. =" From: ". $ from." \ r \ n "; vrati poštu ($ na, $ predmet, $ poruka, $ zaglavlja ) ;) funkcija get_page_url () (// Odredite URL PHP datoteke $ url = "http". (prazno ($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER ["SERVER_NAME"]; if (isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") ($ Url. = $ _SERVER ["REQUEST_URI"];) ostalo. ($ url. = $ _SERVER ["PATH_INFO"];) return $ url;) funkcija rate_limit ($ ip, $ limit_hour = 20, $ limit_10_min = 10) (// Broj pokušaja prijave u posljednjem satu na ovoj IP adresi $ count_hour = ORM: : for_table ("reg_login_attempt") -> where ("ip", sprintf ("% u", ip2long ($ ip))) -> where_raw ("ts> PODVRIJEME (SADA ()," 1: 00 ")") -> count (); // Broj pokušaja prijave u posljednjih 10 minuta na ovoj IP adresi $ count_10_min = ORM :: for_table ("reg_login_attempt") -> gdje ("ip", sprint f ("% u", ip2long ($ ip))) -> where_raw ("ts> SUBTIME (SADA ()," 0:10 ")") -> count (); if ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (ubaci novi izuzetak ("Previše pokušaja prijave!");)) function rate_limit_tick ($ ip, $ email) (// Kreiraj novi zapis u tabeli koji čita broj pokušaja prijave $ login_attempt = ORM :: for_table ("reg_login_attempt") -> kreiraj (); $ login_attempt-> email = $ email; $ login_attempt-> ip = sprintf ("% u", ip2long ($ ip )); $ login_attempt-> save ();) funkcija preusmjeravanja ($ url) (zaglavlje ("Lokacija: $ url"); izlaz;)

Funkcije rate_limit i rate_limit_tick pratite broj pokušaja autorizacije u proteklom vremenskom periodu od prvog pokušaja. Pokušaj prijave se bilježi u bazi podataka u stupcu reg_login_attempt. Ove funkcije se pozivaju kada se podaci obrasca obrađuju i predaju kao što možete vidjeti iz sljedećeg isječka koda.

Kod ispod je preuzet iz datoteke index.php i obrađuje podnošenje obrasca. Vraća JSON odgovor, koji zauzvrat obrađuje jQuery u datoteci sredstva / js / script.js, koje smo već analizirali ranije.

index.php

Pokušajte (ako (! Prazno ($ _ POST) && isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"])) (// Iznesite JSON zaglavlje ("Content-type: application / json"); // Da li je ovo adresa e-pošte valid if (! isset ($ _ POST ["email"]) ||! filter_var ($ _ POST ["email"], FILTER_VALIDATE_EMAIL)) (ubaci novi izuzetak ("Molimo unesite važeći email.");) // Provjerite. Da li je korisniku dozvoljeno da se prijavi, da li je premašio broj dozvoljenih veza? (Functions.php fajl za više informacija) rate_limit ($ _ SERVER ["REMOTE_ADDR"]); // Zabilježite ovaj pokušaj autorizacije rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"], $ _POST ["email"]); // Pošalji e-poštu korisniku $ message = ""; $ email = $ _POST ["email"]; $ subject = "Vaša veza za prijavu"; ako ( ! Korisnik :: postoji ($ email) ) ($ subject = "Hvala na registraciji!"; $ message = "Hvala što ste se registrovali na našem sajtu! \ n \ n";) // Pokušaj autorizacije ili registracije korisnika $ user = Korisnik :: loginOrRegister ($ _ POST [ "email"]); $ message. = "Možete se prijaviti sa ovog URL-a: \ n" ; $ message. = get_page_url (). "? tkn =". $ user-> generateToken (). "\ n \ n"; $ message. = "Link automatski ističe nakon 10 minuta."; $ rezultat = send_email ($ fromEmail, $ _POST ["email"], $ subject, $ message); if (! $ rezultat) (ubaci novi izuzetak ("Došlo je do greške pri slanju vaše e-pošte. Molimo pokušajte ponovo.");) die (json_encode (niz ("message" => "Hvala! Mi \" smo poslali link u vašu pristiglu poštu. Provjerite i vašu spam fasciklu. ")));)) catch (Izuzetak $ e) (die (json_encode (niz (" greška "=> 1," poruka "=> $ e-> getMessage)) )));)

Nakon uspješne autorizacije/registracije, gornji kod će poslati korisniku link za autorizaciju. Token postaje dostupan jer prosljeđuje se kao varijabla u generiranoj vezi metodom $ _GET sa tkn markerom

index.php

If (isset ($ _ GET ["tkn"])) (// Da li je ovaj token validan za autorizaciju? $ User = User :: findByToken ($ _ GET ["tkn"]); if ($ korisnik) (// Da, jeste .Preusmjeravanje na zaštićenu stranicu $ user-> login (); preusmjeravanje ("protected.php");) // Ne, token nije važeći. Preusmjerite na stranicu sa preusmjeravanjem autorizacijskog/registracijskog obrasca (" index.php ";)

$ user-> login ()

će kreirati potrebne varijable za sesiju, tako da će korisnik, gledajući naredne stranice stranice, ostati prijavljen cijelo vrijeme.

Obrada funkcije za izlazak iz sistema uređena je na sličan način.

index.php

If (isset ($ _ GET ["logout"])) ($ user = novi korisnik (); if ($ user-> loggedIn ()) ($ user-> logout ();) preusmjeravanje ("index.php" ) ;)

Na kraju koda, ponovo sam preusmjerio na index.php, dakle parametar ? odjava = 1 proslijeđen URL-om nije potreban.

Naš dosije index.php zahtijeva dodatne zaštita - ne želimo da ljudi koji su se ikada prijavili na sistem ponovo vide obrazac za registraciju. U ove svrhe koristimo metodu $ korisnik-> prijavljen ().

index.php

$ korisnik = novi korisnik (); if ($ user-> loggedIn ()) (preusmjeravanje ("protected.php");)

Konačno, ovdje je dio koda koji vam omogućava da zaštitite stranice vaše stranice i učinite ih dostupnim tek nakon autorizacije.

protected.php

// Da biste zaštitili svaku stranicu na vašem sajtu, uključite fajl // main.php i kreirajte novi objekat korisnika. Kako je to lako! require_once "uključuje / main.php"; $ korisnik = novi korisnik (); if (! $ user-> loggedIn ()) (preusmjeravanje ("index.php");)

Nakon ove provjere, možete biti sigurni da je korisnik uspješno autoriziran. Također možete pristupiti pohranjenim informacijama u bazi podataka koristeći svojstva objekta $ korisnik... Za prikaz e-pošte i statusa korisnika, koristite ovaj kod:

Echo "Vaš email:". $ Korisnik-> email; echo "Vaš rang:". $ korisnik-> rang ();

Metoda rang () ovdje se koristi jer se brojevi obično pohranjuju u bazi podataka (0 za običnog korisnika, 1 za administratora) i te podatke moramo konvertirati u statuse kojima pripadaju, u čemu nam ova metoda pomaže.

Da biste običnog korisnika učinili administratorom, jednostavno uredite unos korisnika preko phpMyAdmin (ili bilo kojeg drugog programa koji vam omogućava upravljanje bazama podataka). Status administratora ne daje nikakve privilegije, u ovom primjeru stranica će prikazati da ste administrator - to je sve.

Ali šta ćete s tim, na vama je, možete sami napisati i sastaviti kod koji postavlja određene privilegije i mogućnosti za administratore.

Gotovi smo!

Završili smo s ovim nevjerovatno super kvazi jednostavnim oblikom! Možete ga koristiti na svojim PHP stranicama, prilično je jednostavno. Takođe, možete ga modifikovati za sebe i napraviti onako kako želite.

Materijal je pripremio Denis Malyshok posebno za stranicu

P.S.Želite li nastaviti sa svojim PHP i OOP iskustvom? Pogledajte premium tutorijale o različitim aspektima izgradnje sajtova, uključujući programiranje u PHP-u, kao i besplatni kurs o izgradnji vašeg CMS sistema u PHP-u od nule koristeći OOP:

Da li vam se dopao materijal i želite da vam se zahvalim?
Samo podijelite sa svojim prijateljima i kolegama!


Ako je potrebno da jedan od odjeljaka vaše stranice učinite dostupnim ograničenom, ali neodređenom krugu ljudi, najlakši način za to je registracija i autorizacija korisnika. Postoji mnogo načina za autentifikaciju korisnika. Mogu se koristiti i alati web servera i alati programskog jezika. Govorićemo o slučaju kada se koriste PHP sesije.

Prvo, razgovarajmo o svim koracima koje ćemo dalje poduzeti. Šta nam uopće treba? Potrebna nam je skripta koja će registrirati korisnika, autorizirati korisnika, preusmjeriti korisnika negdje nakon autorizacije. Također ćemo morati kreirati stranicu koja će biti zaštićena od pristupa neovlaštenih korisnika. Za registraciju i autorizaciju, trebat ćemo kreirati HTML-forme. Podatke o registrovanim korisnicima čuvat ćemo u bazi podataka. To znači da nam je i dalje potrebna skripta za povezivanje sa DBMS-om. Sav naš posao obavljat će funkcije koje ćemo sami pisati. Ove funkcije ćemo sačuvati u zasebnoj datoteci.

Dakle, potrebni su nam sljedeći fajlovi:

  • veza sa DBMS;
  • prilagođene funkcije;
  • autorizacija;
  • registracija;
  • zaštićena stranica;
  • skripta za isključivanje korisnika;
  • skriptu koja provjerava status autorizacije korisnika;
  • stilska lista za najjednostavniji dizajn naših stranica.

Sve ovo bi bilo besmisleno ako nemate odgovarajuću tabelu u bazi podataka. Pokrenite svoj alat za upravljanje DBMS-om (PhpMyAdmin ili komandnu liniju, što god je zgodnije) i pokrenite sljedeći upit u njemu:

CREATE TABLE `korisnici` (` id` int (11) NOT NULL AUTO_INCREMENT, `login` char (16) NOT NULL,` password` char (40) NOT NULL, `reg_date` vremenska oznaka NOT NULL DEFAULT CURRENT_TIMEEYSTAMP (` PRIMARY id`)) ENGINE = MyISAM DEFAULT CHARSET = utf8 AUTO_INCREMENT = 1;

Nazvat ću naše skript datoteke ovako (sve će biti u istom direktoriju):

  • baza podataka.php;
  • functions.php;
  • login.php;
  • registracija.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • style.css.

Svrha svakog od njih vam je, siguran sam, jasna. Počnimo sa DBMS skriptom za povezivanje. Videli ste to ranije. Samo sačuvajte kod za ovu skriptu u datoteci pod nazivom database.php. Prilagođene funkcije ćemo deklarisati u datoteci functions.php. Kako će sve ovo funkcionirati? Neovlašćeni korisnik pokušava da pristupi zaštićenom dokumentu index.php, sistem proverava da li je korisnik autorizovan, ako korisnik nije autorizovan, preusmerava se na stranicu za autorizaciju. Na stranici za autorizaciju korisnik bi trebao vidjeti obrazac za autorizaciju. Hajde da to uradimo.

Autorizacija korisnika

registar.

Sada moramo našem obliku dati određeni izgled. Istovremeno ćemo definirati pravila za ostale elemente. Daću vam kompletan sadržaj tabele stilova, idući ispred sebe.

/ * style.css datoteka * / .row (margin-bottom: 10px; širina: 220px;) .row label (prikaz: blok; font-weight: bold;) .row input.text (font-size: 1.2em; padding: 2px 5px;) .to_reg (veličina fonta: 0,9em;) instrukcija (veličina fonta: 0,8em; boja: #aaaaaa; margin-left: 2px; kursor: default;) .error (boja: crvena; margin-left: 3px;)

Ako je sve urađeno kako treba, trebalo bi da imate sledeće u pretraživaču:

Naravno, još nemamo ni jednog registrovanog korisnika, a da biste se prijavili, potrebno je da se registrujete. Napravimo formular za registraciju.

Registracija korisnika

" />

Verovatno ste primetili da postoje PHP varijable u HTML kodu. Oni su sadržaji atributa tekstualnih polja u obrascima, sadržaji kontejnera za prikaz grešaka. Ali ove varijable nismo inicijalizirali. Uradimo to.

Registracija korisnika

" />
Korisničko ime može sadržavati samo latinične znakove, brojeve, simbole "_", "-", ".". Dužina korisničkog imena mora biti najmanje 4 karaktera i ne duža od 16 znakova
U lozinki možete koristiti samo latinične znakove, brojeve, simbole "_", "!", "(", ")". Lozinka mora imati najmanje 6 znakova i ne duža od 16 znakova
Ponovite prethodno unetu lozinku

U atributu akcije oznake obrasca nije naveden parametar. U tom slučaju, kada se podaci obrasca predaju, oni će biti obrađeni istom skriptom iz koje su dostavljeni. Dakle, moramo napisati kod koji obrađuje podatke obrasca. Ali prvo, razgovarajmo o algoritmu za njihovu obradu.

Potrebno nam je da polja za prijavu i lozinku ne budu prazna. Zatim morate provjeriti usklađenost prijave sa zahtjevima. Lozinka također mora ispunjavati opisane zahtjeve, a ponovljena lozinka mora joj odgovarati i, osim toga, moraju biti identične. Ako bilo koji od ovih uslova nije ispunjen, obrada podataka obrasca treba biti zaustavljena, odgovarajuća obavijest treba biti upisana u niz poruka o grešci i prikazana korisniku. Radi praktičnosti korisnika, sačuvaćemo prijavu koju je on uneo (ako je on to naveo), upisujući njenu vrednost u niz polja $.

Ako je sve u redu, u prozoru vašeg pretraživača, pozivajući se na dokument register.php, trebali biste vidjeti nešto poput ovoga:

Sada, recimo da korisnik klikne na dugme za registraciju bez popunjavanja polja obrasca. Prema našem algoritmu, login i lozinka ne mogu biti prazni. Ukoliko ovaj uslov nije ispunjen, registracija nije moguća. Imamo na umu da se obrada podataka obrasca odvija u trenutnoj skripti. To znači da moramo promijeniti njegov kod dodavanjem odgovarajućih provjera. Odmah ćemo propisati sljedeće provjere. Ako su uneseni i login i lozinka, potrebno je provjeriti njihovu usklađenost sa navedenim zahtjevima. Da bismo provjerili login i lozinku, kreirat ćemo prilagođene funkcije u datoteci functions.php.

/ ** * functions.php * Fajl sa prilagođenim funkcijama * / // Uključuje datoteku sa parametrima za povezivanje sa DBMS-om require_once ("database.php"); // Provjera funkcije korisničkog imena checkLogin ($ str) (// Inicijalizirati varijablu s mogućom porukom o grešci $ error = ""; // Ako ne postoji niz za prijavu, vrati poruku o grešci ako (! $ Str) ($ error = " Niste uneli korisničko ime "; vratite $ error;) / ** * Provjerite korisničko ime pomoću regularnih izraza * Prijava mora biti najmanje 4, ne duža od 16 karaktera * Mora sadržavati latinične znakove, brojeve, * može biti znakovi "_", "-", "." * / $ obrazac = "/^ [-_.az\d ](4,16)$/i"; $ rezultat = preg_match ($ uzorak, $ str) ; // Ako provjera ne uspije, vrati poruku o grešci if (! $ Result) ($ error = "Nevažeći znakovi u korisničkom imenu ili korisničko ime je prekratko (dugo)"; vrati $ error;) // Ako je sve u redu , vrati true return true;) // Provjerite korisničku lozinku funkciju checkPassword ($ str) (// Inicijalizirajte varijablu s mogućom porukom o grešci $ error = ""; // Ako nema pojavljuje se string sa prijavom, vratite poruku o grešci ako (! $ str) ($ error = "Niste uneli lozinku"; return $ error; ) / ** * Provjerite lozinku korisnika pomoću regularnih izraza * Lozinka ne smije biti kraća od 6, ne duža od 16 znakova * Mora sadržavati latinične znakove, brojeve, * može sadržavati znakove "_", "!", " ( ",") "* / $ pattern =" /^ [_!)(.az\d *(6,16)$/i "; $ result = preg_match ($ pattern, $ str); // Ako je provjera nije uspjelo, vrati poruku o grešci ako (! $ rezultat) ($ error = "Nevažeći znakovi u korisničkoj lozinki ili je lozinka prekratka (duga)"; vrati $ error;) // Ako je sve u redu, vrati true return true ;)

Sada moramo modificirati datoteku register.php da koristi funkcije koje smo deklarirali. Skripti ćemo dodati uslov da provjerimo da li je kliknuto na dugme za registraciju. Unutar ovog stanja pokreće se provjera login i lozinki. Ako bilo koja od provjera ne uspije, ponovo prikazujemo obrazac i prikazujemo poruku o grešci. Ako nema grešaka, registriramo korisnika, više ne prikazujemo obrazac za registraciju, obavještavamo korisnika o uspješnoj registraciji i pomoću funkcije zaglavlja () ga preusmjeravamo na obrazac za autorizaciju.

Uspješno ste se registrovali u sistemu. Sada ćete biti preusmjereni na stranicu za prijavu. Ako se to nije dogodilo, idite na to koristeći direktnu vezu.

"; header (" Osvježi: 5; URL = login.php ");) // U suprotnom obavijestite korisnika o grešci inače ($ errors [" full_error "] = $ reg;)))?> Registracija korisnika
" />
Korisničko ime može sadržavati samo latinične znakove, brojeve, simbole "_", "-", ".". Dužina korisničkog imena mora biti najmanje 4 karaktera i ne duža od 16 znakova
U lozinki možete koristiti samo latinične znakove, brojeve, simbole "_", "!", "(", ")". Lozinka mora imati najmanje 6 znakova i ne duža od 16 znakova
Ponovite prethodno unetu lozinku

Trebali ste primijetiti još jednu novu funkciju u skripti - registraciju (). A mi to još nismo objavili. Uradimo to.

// Registracija funkcije funkcije registracije korisnika ($ prijava, $ lozinka) (// Inicijaliziranje varijable s mogućom porukom o grešci $ error = ""; // Ako nema niza za prijavu, vratite poruku o grešci ako (! $ Login) ($ error = "Prijava nije navedena"; vrati $ error;) elseif (! $ lozinka) ($ error = "Lozinka nije navedena"; vrati $ error;) // Provjerite da li je korisnik već registriran // Povežite se na DBMS connect () ; // Napišite niz upita $ sql = "SELECT` id` FROM `users` WHERE` login` = "". $ Login. "" "; // Napravite upit bazi podataka $ query = mysql_query ($ sql) ili die ( ""); // Pogledajte broj korisnika sa ovom prijavom, ako postoji barem jedan, // vratite poruku o grešci if (mysql_num_rows ($ query)> 0) ($ error = "Korisnik sa navedenom prijavom je već registrovan"; vrati $grešku;) // Ako nema takvog korisnika, registriraj ga // Napiši string upita $ sql = "INSERT INTO` users` (`id`,` login `, `lozinka`) VRIJEDNOSTI (NULL," ". $ prijava." "," ". $ lozinka. "") "; // Napravite upit bazi podataka $ query = mysql_query ($ sql) ili umri ("

Nije moguće dodati korisnika: ". Mysql_error ().". Došlo je do greške u redu ". __LINE__."

"); // Ne zaboravite prekinuti vezu sa DBMS-om mysql_close (); // Vraća vrijednost true, što ukazuje na uspješnu registraciju korisnika vraća true;)

Ako je sve u redu, vaš korisnik će biti registrovan. Možete testirati obrazac. Pokušajte registrirati korisnike sa istim loginovima. Nakon uspješne registracije, korisnik će biti preusmjeren na formular za autorizaciju. Ranije smo samo kreirali oznake za prikaz ovog obrasca. Budući da u njegovom atributu akcije nije naveden parametar, podaci koje je obrazac dostavio će biti obrađeni u istoj skripti. Dakle, moramo napisati kod za obradu i dodati ga u login.php dokument.

Autorizacija korisnika

;">

Ako niste registrovani u sistemu, registrujte se.

Vjerovatno ste primijetili da u autorizacijskoj skripti imamo još jednu nepoznatu funkciju - autorizaciju (). Ova funkcija bi trebala ovlastiti korisnika tako što će prvo provjeriti postoji li registrirani korisnik u bazi podataka s istim korisničkim imenom i lozinkom. Ako se takav korisnik ne pronađe, autorizacija će biti prekinuta i na ekranu će se prikazati poruka o grešci. Ako je provjera uspješna, funkcija autorizacije () će pokrenuti sesiju i u nju upisati vrijednosti korisničkog imena i lozinke, obavijestiti skriptu o uspješnosti autorizacije, a skripta će preusmjeriti korisnika na stranicu zaštićenog resursa.

/ ** * Funkcija autorizacije korisnika. * Autorizacija korisnika kod nas će se vršiti * korištenjem PHP sesija. * / autorizacija funkcije ($ prijava, $ lozinka) (// Inicijaliziranje varijable s mogućom porukom o grešci $ error = ""; // Ako nema linije za prijavu, vratite poruku o grešci ako (! $ prijava) ($ greška = " Prijava nije navedena "; return $ error;) elseif (! $ Lozinka) ($ error =" Lozinka nije navedena "; vrati $ error;) // Provjerite da li je korisnik već registriran // Povežite se na DBMS konekciju ( ); // Moramo provjeriti postoji li takav korisnik među registriranim // Sastavljanje niza upita $ sql = "SELECT` id` FROM `users` WHERE` login` = "". $ Login. "" I `password` =" ". $ Lozinka . "" "; // Izvršite upit $ query = mysql_query ($ sql) ili umri ("

Nije moguće izvršiti upit: ". Mysql_error ().". Došlo je do greške u redu ". __LINE__."

"); // Ako nema korisnika sa takvim podacima, vratite poruku o grešci if (mysql_num_rows ($ query) == 0) ($ error =" Korisnik sa navedenim podacima nije registrovan "; vrati $ error;) // Ako korisnik postoji, pokrenite sesiju session_start (); // I upišite korisničko ime i lozinku u nju // Za ovo koristimo superglobalni niz $ _SESSION $ _SESSION ["login"] = $ login; $ _SESSION [" lozinka"] = $ lozinka; / / Ne zaboravite zatvoriti vezu baze podataka mysql_close (); // Vrati true za poruku o uspješnoj autorizaciji korisnika vrati true;)

Kada korisnik uđe na zaštićenu stranicu, potrebno je provjeriti ispravnost njegovih autorizacijskih podataka. Za ovo nam je potrebna još jedna prilagođena funkcija. Nazovimo to checkAuth (). Njegov zadatak će biti da provjeri autorizacijske podatke korisnika s onima koji su pohranjeni u našoj bazi podataka. Ako se podaci ne podudaraju, korisnik će biti preusmjeren na stranicu za autorizaciju.

Funkcija checkAuth ($ prijava, $ lozinka) (// Ako nema korisničkog imena ili lozinke, vratite false ako (! $ Prijava ||! $ Lozinka) vrati false; // Provjerite da li je takav korisnik registriran // Povežite se na DBMS connect (); // Kreirajte string upita $ sql = "SELECT` id` FROM `users` WHERE` login` = "". $ Login. "" I `password` =" ". $ Lozinka." "" ; // Izvršite upit $ query = mysql_query ($ sql) ili umri ("

Nije moguće izvršiti upit: ". Mysql_error ().". Došlo je do greške u redu ". __LINE__."

"); // Ako nema korisnika s takvim podacima, vrati false; if (mysql_num_rows ($ upit) == 0) (vrati false;) // Ne zaboravi zatvoriti vezu baze podataka mysql_close (); // Inače , vrati true vrati true;)

Sada kada je korisnik na sigurnoj stranici, moramo pozvati funkciju validacije podataka autorizacije. Postavićemo skriptu za poziv i proveru u poseban checkAuth.php fajl i povezati ga sa stranicama koje će biti zatvorene za javni pristup.

/ ** * Skripta za provjeru autorizacije korisnika * / // Pokreni sesiju, iz koje ćemo izdvojiti login i lozinku // prijavljenih korisnika session_start (); // Uključuje datoteku sa prilagođenim funkcijama require_once ("functions.php"); / ** * Da bismo utvrdili da li je korisnik prijavljen, moramo * provjeriti da li postoje zapisi u bazi podataka za njegovu prijavu * i lozinku. Da bismo to učinili, koristit ćemo prilagođenu funkciju * ​​za provjeru ispravnosti prijavljenih korisničkih podataka. * Ako ova funkcija vrati false, onda nema autorizacije. * U nedostatku autorizacije, jednostavno preusmjeravamo * korisnika na stranicu za autorizaciju. * / // Ako sesija sadrži i podatke za prijavu i lozinku, // provjerite ih ako (isset ($ _ SESSION ["login"]) && $ _SESSION ["login"] && isset ($ _ SESSION ["password" ] ) && $ _SESSION ["password"]) (// Ako provjera valjanosti postojećih podataka ne uspije ako (! CheckAuth ($ _ SESSION ["login"], $ _SESSION ["password"])) (// Preusmjerite korisnika na zaglavlje autorizacijske stranice ("location: login.php"); // Zaustavite izlaz iz izvršavanja skripte;)) // Ako nema podataka ni o loginu ni o korisničkoj lozinki, // mislimo da nema autorizacije, preusmjerite korisnik // na stranicu autorizacije else ( zaglavlje ("location: login.php"); // Prekini izlaz skripte;)

Sada kreirajmo kod za našu sigurnu stranicu. Biće prilično jednostavno.

Autorizacija i registracija korisnika

Uspješno odobrenje.

Pristupili ste sigurnoj stranici. Možete se odjaviti sa sistema.

Kao što vidite, u zaštićeni dokument uključujemo samo jednu datoteku - checkAuth.php. Svi ostali fajlovi su uključeni u druge skripte. Stoga naš kod ne izgleda glomazno. Organizirali smo registraciju i autorizaciju korisnika. Sada morate omogućiti korisnicima da se odjave. Da bismo to uradili, kreiraćemo skriptu u datoteci logout.php.

/ ** * Skripta za odjavu korisnika. Pošto su korisnici * autorizovani kroz sesije, njihova prijava i lozinka su pohranjeni * u superglobanskom nizu $ _SESSION. Da biste se odjavili sa sistema, jednostavno uništite vrijednosti * niza $ _SESSION ["login"] i $ _SESSION ["password"], nakon čega * preusmjeravamo korisnika na stranicu za autorizaciju * ​​/ // Budite sigurni za pokretanje sesije session_start (); poništeno ($ _ SESSION ["login"]); poništeno ($ _ SESSION ["password"]); zaglavlje ("lokacija: login.php");

Skripta za registraciju, autorizaciju i verifikaciju korisnika je spremna. Možete ga koristiti kod kuće, dopunjavati, mijenjati prema vašim potrebama. Ako imate bilo kakvih pitanja, možete ih postaviti u komentarima. Možete sami preuzeti sve ovdje navedene fajlove, spakovane u jednu arhivu.

P.S. Svjestan sam da je bolje pisati objektno orijentisani kod, znam da se šifra ne isplati prenositi i čuvati u čistom tekstu, da se podaci uneseni u bazu moraju prethodno provjeriti. Znam. Neću o ovome ovdje.

Dakle, postoji zadatak - izvršiti registraciju u sistemu i mogućnost autorizacije. Kako uraditi? Počnimo redom.

PHP registracija

Ovdje je sve jednostavno. Izrađuje se skladište podataka za korisnike. Ovo je obično tabela baze podataka. Sadrži polja kao što su id, korisničko ime i lozinka. Ostala polja su opciona. Možete prikupljati e-poštu korisnika, njihove adrese, mogući IP, vrijeme pristupa mreži, šifrirane riječi sa bankovnih kartica, tajna pitanja...

Općenito, glavna stvar je par prijava-lozinka.

Prva važna tačka- ne možete pohraniti korisničke lozinke u čistom tekstu. Odnosno, kao tekst. To je nemoguće jer ako neko drugi dobije pristup bazi, on će dobiti bazu podataka korisničkih imena-lozinki, što mu se neće svidjeti. A ako se uzme u obzir da je login-lozinka za mnoge korisnike na različitim servisima ista - to ugrožava i lične podatke i finansije i ličnu prepisku i sve ostalo.

Lozinke moraju biti pohranjene kao hash. Hashing To je operacija koja pretvara originalne podatke u neku vrstu cast poznate dužine. Ovo je dobro jer je glumačka ekipa jedinstvena. Odnosno, ako promijenimo barem jedan znak u izvornim podacima, snimak na izlazu operacije heširanja će ispasti u potpunosti, do neprepoznatljivosti od strane drugih. Operacija heširanja je nepovratna, odnosno neće biti moguće proširiti originalne podatke iz ovog nugget-a. Po tome se razlikuje od enkripcije.

MySQL i php dijele istu zajedničku i sigurnu funkciju heširanja - md5. Ovaj algoritam uzima podatke i proizvodi otisak prsta.

Dakle, primamo podatke od korisnika, provjeravamo da li su prazni, da li ne sadrže znakove koji nam nisu potrebni (ne ograničavajte korisnike previše). A sada postavljamo ovakav zahtjev:

INSERT INTO `users` (`id`, `username`,` password`) VRIJEDNOSTI ("", $ quoted_username, MD5 ($ quoted_password));

Imajte na umu - posebno sam nazvao varijable $ quoted_ jer prije nego što ih ubacite u upit, one moraju biti izbjegnute pomoću funkcije mysql_real_escape_string (). Pošto se ova funkcija vrlo često koristi, a napisana je jako dugo (obožavam pkhp arhitekte) - preporučujem da je ugurate u svoju ljusku. Na primjer, ovako:

Navod funkcije ($ var) (vrati mysql_real_escape_string ($ var);)

PHP prijava

Dodali smo novog korisnika i sada je on ovlašten. Nacrtamo mu obrazac za prijavu i lozinku i uhvatimo njegove podatke. Šta je sledeće? Na kraju krajeva, lozinka nam je došla u čistom tekstu, au bazi podataka - heš lozinke. Morate pretvoriti lozinku u heš, a zatim ih uporediti? Ne, možete to učiniti lakše - u jednom zahtjevu.

SELECT * FROM `users` WHERE` login` = $ qoted_login I `password` = MD5 ($ quoted_password);

Ako zahtjev vrati string, to će biti niz sa korisničkim podacima. Ako nije, u tabeli nema takvog korisnika. Korisnički podaci su nam vrlo korisni - vrijedi ih staviti u asocijativni niz.

Zapamti korisnika

Sada moramo zapamtiti da je korisnik ovlašten i da znamo tačno o kome se radi. Prva stvar koja vam pada na pamet je korištenje kolačića za ovo. Zaista - ugurati korisničko ime i id korisnika u kolačić i uvijek znati ko traži stranicu u ovom trenutku.

Ali ovo je opaka praksa. Zašto? Zato što je kolačić datoteka koju korisnik pohranjuje u pretraživač i podaci iz te datoteke se prenose na server u svakom zahtjevu. Prvo, oni se prenose kao tekst, što znači da ih je lako presresti. Drugo, to je jednostavan tekst koji šalje korisnik. Stoga se može doslovno prepisati. Na primjer, ako odlučimo pohraniti korisničko ime "Vasya" u kolačiće, on može otvoriti upravljanje kolačićima u svom pretraživaču, pronaći željeni kolačić i popraviti ga na, recimo, "Admin". I to je sve. Sada ćemo uz svaki zahtjev dobiti kolačić koji će nam reći korisničko ime korisnika - "Admin".

Stoga je sigurnije pohraniti sve podatke na server na mjestu nedostupnom s weba. U nekom folderu kojem se ne može pristupiti iz pretraživača. U ovu fasciklu treba da upišete sve podatke o korisniku i da ih pročitate odatle svaki put kada zatraži dokument. Da biste saznali koji korisnik posjeduje koju datoteku podataka, trebate nazvati datoteku jedinstvenim imenom i baciti ovo ime u kolačić za korisnika. Dakle, korisnik neće moći da sazna kako se datoteka zove za administratora - ovu datoteku generiše sistem na serveru. A ovo vam omogućava da prevučete iz dokumenta u dokument čak i jasne lozinke.

Ono što sam opisao je mehanizam sesije... U Perlu, na primjer, morate učitati module da biste koristili sesije. I u php-u, sesije su podržane van kutije. Zapravo, sve što trebate znati je funkcija session_start () i niz $_SESSION. To je sve. Reći ću ti sada.

U svakoj skripti u kojoj ćete pisati ili čitati sa sesije, trebate prije nego što prikažete bilo koju informaciju pozovite funkciju session_start (). Ovo će započeti sesiju. Ova funkcija će kreirati datoteku sesije ako ne postoji ili će je pročitati ako je poseban kolačić proslijeđen skripti.

Da biste upisali podatke u sesiju, samo ih trebate upisati u niz $_SESSION. Sada moramo zapamtiti ID korisnika.

$_SESSION ["userid"] = $korisničke informacije ["id"];

Sve. Sada, svaki put kada korisnik zatraži skriptu koja koristi sesije, vrijednost elementa $ _SESSION ["userid"] će vam biti dostupna.

Dakle, kada je korisnik unio login i lozinku, dobili smo njegove podatke iz baze, što potvrđuje da se takav korisnik nalazi u našoj bazi podataka, pamtimo ga u sesiji.

Saznajte da li je korisnik ovlašten

Pa, ovo je lako kao ljuštenje krušaka! Sada kada znate kako funkcionišu sesije, otkrivanje da li je korisnik prijavljen je stvar jednog reda. Evo je:

If (isset ($ _ SESSION ["userid"])) (ispisati "korisnik je ovlašten";)

Ako je korisnički ID definiran u sesiji, onda je već prošao autorizaciju. Ali kako znate koji je to korisnik? Koje je njegovo korisničko ime? Datum rođenja? Šifra za bankovnu karticu? Majčino djevojačko prezime?

Pa, očito - napravite jedan upit tablici korisnika. Imamo ID ovog korisnika.

SELECT * FROM `users` WHERE` id` = $ quoted_userid

Kako odjaviti korisnika, odjaviti se

Pa, to je zaista prilično jednostavno. Ako utvrdimo da li je korisnik autorizovan prisustvom korisničkog id-a u sesiji, onda da bismo ga odjavili, moramo ga obrisati odatle. Radi se ovako:

Poništeno ($ _ SESSION ["userid"]);

Također možete ubiti sesiju zbog lojalnosti. Ovo će obrisati korisnikov kolačić i uništiti datoteku sesije na serveru. U tom slučaju, svi podaci će biti izgubljeni iz njega. Radi se ovako:

Session_destroy ();

To je sve. Ako imate bilo kakvih pitanja, slobodno nas kontaktirajte. Štaviše, možete me kontaktirati putem icq-a ili poštom i tražiti pomoć oko nečega. Obično ne odbijam. Ako je potrebna ozbiljna pomoć, mogu tražiti malu uplatu. Osim toga, mogu vas naučiti kako napraviti web stranice na daljinu! Tako sam ja trener i guru :) A ako želite besplatno da primate lekcije i trikove, pretplatite se na RSS mog bloga.

Sponzor ovog posta je ibooknet.ru, koji nudi popravke laptopa po povoljnim cijenama. Lično, moj laptop je u redu i nadam se da neću morati da ga popravljam. Što ti želim.

Proces kreiranja sistema registracije je dosta posla. Morate napisati kod kako biste još jednom provjerili valjanost adresa e-pošte, poslali e-poruke s potvrdom, ponudili mogućnost oporavka lozinki, pohranili lozinke na sigurno mjesto, potvrdili obrasce za unos i još mnogo toga. Čak i kada sve ovo uradite, korisnici će nerado da se registruju, jer čak i najmanja registracija zahteva njihovu aktivnost.

U današnjem tutorijalu razvijat ćemo jednostavan sistem registracije koji neće zahtijevati korištenje lozinke! Kao rezultat, dobićemo sistem koji se lako može modifikovati ili integrisati u postojeći PHP sajt. Ako ste zainteresovani, nastavite čitati.

PHP

Sada smo spremni da se pozabavimo PHP kodom. Glavnu funkcionalnost sistema registracije pruža klasa User, koju možete vidjeti u nastavku. Klasa koristi (), što je minimalistička biblioteka za rad sa bazama podataka. Klasa User je odgovorna za pristup bazama podataka, generisanje tokena za prijavu i njihovu validaciju. Predstavlja nam jednostavan interfejs koji se lako može ugraditi u sistem registracije na vašim PHP sajtovima.

User.class.php

// Privatna ORM instanca
privatni $ orm;

/**
* Pronađite korisnika prema nizu tokena. Uzimaju se samo važeći tokeni
* razmatranje. Token vrijedi 10 minuta nakon što je generiran.
* @param string $ token Token za traženje
* @return User
*/

Javna statička funkcija findByToken ($ token) (

// pronađite ga u bazi podataka i provjerite je li vremenska oznaka ispravna


-> gdje ("žeton", $ token)
-> where_raw ("token_validity> SADA ()")
-> find_one ();

Ako (! $ Rezultat) (
return false;
}

Vratite novog korisnika ($ rezultat);
}

/**
* Ili se prijavite ili registrirajte korisnika.
* @return User
*/

Javna statička funkcija loginOrRegister ($ email) (

// Ako takav korisnik već postoji, vratite ga

Ako (Korisnik :: postoji ($ email)) (
vratite novog korisnika ($ email);
}

// U suprotnom, kreirajte ga i vratite

Povratak korisnika :: kreirajte ($ email);
}

/**
* Kreirajte novog korisnika i sačuvajte ga u bazi podataka
* @param string $ email Adresa e-pošte korisnika
* @return User
*/

Privatna statička funkcija kreiranje ($ email) (

// Upisati novog korisnika u bazu podataka i vratiti ga

$ rezultat = ORM :: for_table ("reg_users") -> kreirati ();
$ rezultat-> email = $ email;
$ rezultat-> sačuvaj ();

Vratite novog korisnika ($ rezultat);
}

/**
* Provjerite postoji li takav korisnik u bazi podataka i vratite boolean.
* @param string $ email Adresa e-pošte korisnika
* @return boolean
*/

Javna statička funkcija postoji ($ email) (

// Postoji li korisnik u bazi podataka?
$ rezultat = ORM :: za_tabelu ("reg_users")
-> gdje ("e-pošta", $ email)
-> count ();

Vrati $ rezultat == 1;
}

/**
* Kreirajte novi korisnički objekat
* @param $ param ORM instanca, id, email ili null
* @return User
*/

Javna funkcija __construct ($ param = null) (

If ($ param instanceof ORM) (

// Prošla je ORM instanca
$ this-> orm = $ param;
}
else if (is_string ($ param)) (

// E-mail je proslijeđen
$ ovo->
-> gdje ("e-pošta", $ param)
-> find_one ();
}
drugo (

If (is_numeric ($ param)) (
// ID korisnika je proslijeđen kao parametar
$ id = $ param;
}
else if (isset ($ _ SESSION ["loginid"])) (

// Nije proslijeđen korisnički ID, pogledajte sesiju
$ id = $ _SESSION ["loginid"];
}

$ this-> orm = ORM :: za_tabelu ("reg_users")
-> gdje ("id", $ id)
-> find_one ();
}

/**
* Generira novi SHA1 token za prijavu, upisuje ga u bazu podataka i vraća.
* @return string
*/

Javna funkcija generateToken () (
// generira token za prijavljenog korisnika. Sačuvajte ga u bazi podataka.

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

// Sačuvajte token u bazi podataka,
// i označite ga kao važeće samo sljedećih 10 minuta

$ this-> orm-> set ("token", $ token);
$ this-> orm-> set_expr ("token_validity", "ADDTIME (SADA ()," 0:10 ")");
$ ovo-> orm-> sačuvaj ();

Vrati token $;
}

/**
* Prijavite se ovog korisnika
* @return void
*/

Prijava na javnu funkciju () (

// Označi korisnika kao prijavljenog
$ _SESSION ["loginid"] = $ this-> orm-> id;

// Ažuriraj polje last_login db
$ this-> orm-> set_expr ("zadnja_prijava", "SADA ()");
$ ovo-> orm-> sačuvaj ();
}

/**
* Uništite sesiju i odjavite korisnika.
* @return void
*/

Odjava sa javne funkcije () (
$ _SESSION = niz ();
poništeno ($ _ SESSION);
}

/**
* Provjerite da li je korisnik prijavljen.
* @return boolean
*/

Javna funkcija prijavljena () (
vrati isset ($ this-> orm-> id) && $ _SESSION ["loginid"] == $ this-> orm-> id;
}

/**
* Provjerite je li korisnik administrator
* @return boolean
*/

Javna funkcija jeAdmin () (
return $ this-> rank () == "administrator";
}

/**
* Pronađite tip korisnika. Može biti admin ili običan.
* @return string
*/

čin javne funkcije () (
ako ($ ovo-> orm-> rang == 1) (
vrati "administrator";
}

Povratak "običan";
}

/**
* Magični metod za pristup elementima privatnog
* $ orm instanca kao svojstva korisničkog objekta
* @param string $ key Ime pristupnog svojstva
* @return mješovito
*/

Javna funkcija __get ($ ključ) (
if (isset ($ this-> orm -> $ ključ)) (
vrati $ this-> orm -> $ ključ;
}

Vrati null;
}
}
Tokeni se generiraju pomoću algoritma i pohranjuju u bazi podataka. Koristimo MySQL za postavljanje stupca token_validity na 10 minuta. Prilikom provjere valjanosti tokena, kažemo motoru da nam je potreban token, polje token_validity još nije isteklo. Stoga ograničavamo vrijeme tokom kojeg će token biti važeći.

Imajte na umu da koristimo magičnu metodu __get () na kraju dokumenta za pristup svojstvima korisničkog objekta. Ovo nam omogućava pristup podacima koji su pohranjeni u bazi podataka u obliku svojstava: $ user-> email, $ user-> token. Na primjer, da vidimo kako možemo koristiti ovu klasu u sljedećem isječku koda:


Druga datoteka koja pohranjuje potrebnu funkcionalnost je functions.php. Tu imamo nekoliko pomoćnih funkcija koje nam omogućuju da ostatak koda držimo urednim.

Functions.php

Funkcija send_email ($ od, $ do, $ predmet, $ poruka) (

// Pomoćna funkcija za slanje e-pošte

$ headers = "MIME-verzija: 1.0". "\ r \ n";
$ headers. = "Tip sadržaja: tekst / običan; skup znakova = utf-8". "\ r \ n";
$ headers. = "Od:". $ from. "\ r \ n";

Povratak pošte ($ za, $ predmet, $ poruka, $ zaglavlja);
}

funkcija get_page_url () (

// Saznajte URL PHP datoteke

$ url = "http". (prazno ($ _ SERVER ["HTTPS"])? "": "s"). ": //". $ _ SERVER ["SERVER_NAME"];

Ako (isset ($ _ SERVER ["REQUEST_URI"]) && $ _SERVER ["REQUEST_URI"]! = "") (
$ url = $ _SERVER ["REQUEST_URI"];
}
drugo (
$ url = $ _SERVER ["PATH_INFO"];
}

Povrat $ url;
}

funkcija rate_limit ($ ip, $ limit_hour = 20, $ limit_10_min = 10) (

// Broj pokušaja prijavljivanja za zadnji sat sa ove IP adrese

$ count_hour = ORM :: za_tabelu ("reg_login_attempt")
->
-> where_raw ("ts> PODVRIJEME (SADA ()," 1:00 ")")
-> count ();

// Broj pokušaja prijave u posljednjih 10 minuta putem ove IP adrese

$ count_10_min = ORM :: za_tabelu ("reg_login_attempt")
-> gdje ("ip", sprintf ("% u", ip2long ($ ip)))
-> where_raw ("ts> PODVRIJEME (SADA ()," 0:10 ")")
-> count ();

Ako ($ count_hour> $ limit_hour || $ count_10_min> $ limit_10_min) (
izbaci novi izuzetak ("Previše pokušaja prijave!");
}
}

funkcija rate_limit_tick ($ ip, $ email) (

// Kreirajte novi zapis u tabeli pokušaja prijave

$ login_attempt = ORM :: za_tabelu ("reg_login_attempt") -> kreiraj ();

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

$ login_attempt-> save ();
}

funkcija preusmjeravanja ($ url) (
header ("Lokacija: $ url");
Izlaz;
}
Funkcije rate_limit i rate_limit_tick nam omogućavaju da ograničimo broj pokušaja autorizacije za određeni vremenski period. Pokušaji autorizacije se bilježe u bazi podataka reg_login_attempt. Ove funkcije se pokreću kada se pošalje formular za autorizaciju, kao što možete vidjeti u sljedećem isječku koda.

Donji kod je preuzet sa index.php i odgovoran je za podnošenje obrasca za prijavu. Vraća JSON odgovor, koji je vođen jQuery kodom koji smo vidjeli u sredstvima / js / script.js.

index.php

Ako (! Prazno ($ _ POST) && isset ($ _ SERVER ["HTTP_X_REQUESTED_WITH"])) (

// Izlaz JSON zaglavlja

Zaglavlje ("Tip sadržaja: aplikacija / json");

// Da li je email adresa važeća?

Ako (! Isset ($ _ POST ["email"]) ||! Filter_var ($ _ POST ["email"], FILTER_VALIDATE_EMAIL)) (
throw new Exception ("Molimo unesite važeći email.");
}

// Ovo će izbaciti izuzetak ako je osoba iznad
// dozvoljena ograničenja pokušaja prijave (pogledajte functions.php za više):
rate_limit ($ _ SERVER ["REMOTE_ADDR"]);

// Zabilježite ovaj pokušaj prijave
rate_limit_tick ($ _ SERVER ["REMOTE_ADDR"], $ _POST ["e-pošta"]);

// Pošaljite poruku korisniku

$ message = "";
$ email = $ _POST ["e-pošta"];
$ subject = "Vaš link za prijavu";

Ako (! Korisnik :: postoji ($ email)) (
$ subject = "Hvala na registraciji!";
$ message = "Hvala što ste se registrovali na našem sajtu! \ n \ n";
}

// Pokušaj prijave ili registracije osobe
$ user = Korisnik :: loginOrRegister ($ _ POST ["email"]);

$ message. = "Možete se prijaviti sa ovog URL-a: \ n";
$ message. = get_page_url (). "? tkn =". $ user-> generateToken (). "\ n \ n";

$ message. = "Link automatski ističe nakon 10 minuta.";

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

Ako (! $ Rezultat) (
throw new Exception ("Došlo je do greške prilikom slanja vaše e-pošte. Pokušajte ponovo.");
}

Die (json_encode (niz (
"message" => "Hvala! Poslali smo vam link u inbox. Provjerite i svoj spam folder."
)));
}
}
uhvatiti (izuzetak $ e) (

Die (json_encode (niz (
"greška" => 1,
"message" => $ e-> getMessage ()
)));
}
Nakon uspješne autorizacije ili registracije, gornji kod šalje e-mail osobi s linkom za autorizaciju. Token (token) je dostupan kao $ _GET varijabla "tkn" zbog generiranog URL-a.

index.php

Ako (isset ($ _ GET ["tkn"])) (

// Je li ovo valjan token za prijavu?
$ user = Korisnik :: findByToken ($ _ GET ["tkn"]);

// Da! Prijavite se korisnika i preusmjerite na zaštićenu stranicu.

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

// Nevažeći token. Preusmjerite natrag na obrazac za prijavu.
preusmjeravanje ("index.php");
}
Pokretanje $ user-> login () će kreirati potrebne varijable sesije, omogućavajući korisniku da ostane prijavljen pri narednim prijavama.

Odjava se implementira na približno isti način:

Index.php

Ako (isset ($ _ GET ["odjava"])) (

$ korisnik = novi korisnik ();

Ako ($ korisnik-> prijavljen ()) (
$ user-> logout ();
}

Preusmjeravanje ("index.php");
}
Na kraju koda ponovo preusmjeravamo korisnika na index.php, tako da je parametar?Odjava = 1 u URL-u isključen.

Naš index.php fajl će takođe trebati zaštitu - ne želimo da već prijavljeni korisnici vide obrazac. Za ovo koristimo metodu $ user-> loggedIn ():

Index.php

$ korisnik = novi korisnik ();

if ($ user-> loggedIn ()) (
preusmjeravanje ("protected.php");
}
Na kraju, hajde da vidimo kako možete zaštititi stranicu na svojoj web lokaciji i učiniti je dostupnom tek nakon autorizacije:

protected.php

// Za zaštitu bilo koje php stranice na vašem sajtu, uključite main.php
// i kreiramo novi objekt korisnika. To je tako jednostavno!

require_once "uključuje / main.php";

$ korisnik = novi korisnik ();

ako (! $ korisnik-> prijavljen ()) (
preusmjeravanje ("index.php");
}
Nakon ove provjere, možete biti sigurni da se korisnik uspješno prijavio. Također ćete imati pristup podacima pohranjenim u bazi podataka kao svojstvima $ user objekta. Za prikaz korisničke e-pošte i njegovog ranga koristite sljedeći kod:

Echo "Vaš email:". $ Korisnik-> email;
echo "Vaš rang:". $ korisnik-> rang ();
Ovdje je rank () metoda, budući da stupac ranga u bazi podataka obično sadrži brojeve (0 za obične korisnike i 1 za administratore), a sve to moramo konvertirati u nazive ranga, što se implementira pomoću ove metode. Da konvertujete običnog korisnika u administratora, jednostavno uredite korisnički zapis u phpmyadmin (ili bilo kom drugom programu baze podataka). Kao administrator, korisnik neće imati nikakve posebne karakteristike. Vi sami imate pravo da odaberete koja prava ćete dodijeliti administratorima.

Spremni!

Sa ovim je naš jednostavan sistem registracije spreman! Možete ga koristiti na postojećoj PHP stranici ili ga možete nadograditi da odgovara vašim zahtjevima.

Top srodni članci