Php mysql sistem autorizacije. Kreiramo neverovatno jednostavan sistem registracije u PHP i MySQL
Php mysql sistem autorizacije. Kreiramo neverovatno jednostavan sistem registracije u PHP i MySQL
05.09.2019Internet, Wi-Fi, lokalne mreže
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:
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:
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 /
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:
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.