Kako postaviti pametne telefone i računala. Informativni portal
  • Dom
  • Vijesti
  • Inurl php ID vrste proizvoda osobni račun. Izgradnja nevjerojatno jednostavnog sustava registracije u PHP-u i MySQL-u

Inurl php ID vrste proizvoda osobni račun. Izgradnja nevjerojatno jednostavnog sustava registracije u PHP-u i MySQL-u

Reg.ru: domene i hosting

Najveći registrar i pružatelj usluga hostinga u Rusiji.

Više od 2 milijuna naziva domena u službi.

Promocija, domenska pošta, poslovna rješenja.

Više od 700 tisuća kupaca diljem svijeta već je odabralo svoj izbor.

*Pređite mišem da biste pauzirali pomicanje.

Natrag naprijed

Izrada jednostavnog sustava registracije korisnika u PHP-u i MySQL-u

Stvaranje registracijskog sustava je veliki posao. Morate napisati kod koji potvrđuje adrese e-pošte, šalje e-poruku kojom potvrđuje registraciju, također potvrđuje valjanost ostalih polja obrazaca i još mnogo toga.

I nakon što sve ovo napišete, korisnici će se nerado registrirati, jer... ovo zahtijeva određeni napor s njihove strane.

U ovom vodiču ćemo stvoriti vrlo jednostavan sustav registracija koja uopće ne zahtijeva niti pohranjuje lozinke! Rezultat će biti lako modificirati i dodati postojećem PHP mjestu. Želite li saznati kako funkcionira? Pročitajte u nastavku.



Evo kako će funkcionirati naš super jednostavan sustav:

Kombinirat ćemo obrazac za autorizaciju i registraciju. Ovaj obrazac će imati polje za unos vaše e-mail adrese i gumb za registraciju;
- Prilikom popunjavanja polja s email adresom, klikom na gumb za registraciju kreirat će se zapis o novom korisniku, ali samo ako upisana email adresa nije pronađena u bazi.

Nakon ovoga, slučajni jedinstveni set znakova (token) koji se šalje odredio korisnik e-mail u obliku linka koji će biti relevantan unutar 10 minuta;
- Link vodi korisnika na našu web stranicu. Sustav utvrđuje prisutnost tokena i autorizira korisnika;

Prednosti ovog pristupa:

Nema potrebe za pohranjivanjem lozinki ili potvrđivanjem polja;
- Nema potrebe za vraćanjem lozinke, sigurnosnih pitanja itd.;
- Od trenutka registracije/prijave korisnika, uvijek možete biti sigurni da će taj korisnik biti u vašoj pristupnoj zoni (da je e-mail adresa istinita);
- Nevjerojatno jednostavan proces registracije;

Mane:

Sigurnost korisničkog računa. Ako netko ima pristup korisnikovoj pošti, može se prijaviti.
- E-pošta nije sigurna i može se presresti. Imajte na umu da je ovo pitanje također relevantno u slučaju kada je lozinka zaboravljena i treba je vratiti ili u bilo kojem sustavu autorizacije koji ne koristi HTTPS za prijenos podataka (prijava/lozinka);
- Dok ispravno konfigurirate svoj poslužitelj e-pošte, postoji mogućnost da poruke s vezama za autorizaciju završe u spamu;

Uspoređujući prednosti i nedostatke našeg sustava, možemo reći da sustav ima visoku upotrebljivost (maksimalna pogodnost za krajnjeg korisnika), a istovremeno ima nizak pokazatelj sigurnosti.

Stoga je preporučljivo koristiti ga za registracije na forumima i servisima koji ne rade s važnim informacijama.

Kako koristiti ovaj sustav

U slučaju da samo trebate koristiti sustav za autorizaciju korisnika na vašoj web-lokaciji, a ne želite ovu lekciju uzeti u komadiće, evo što trebate učiniti:

Morate preuzeti izvore priložene lekciji
- Pronađite datoteku tables.sql u arhivi. Uvezite je u svoju bazu pomoću opcije uvoza u phpMyAdmin. Alternativni način: otvori ovu datoteku putem uređivač teksta, kopirajte SQL upit i izvršite ga;
- Otvorite include/main.php i ispunite postavke za povezivanje s vašom bazom (navedite korisnika i lozinku za povezivanje s bazom, kao i host i naziv baze). U istoj datoteci također morate navesti e-mail koji će se koristiti kao izvorna adresa za poruke koje šalje sustav. Neki hostovi blokiraju odlaznu e-poštu osim ako obrazac ne sadrži stvarnu adresu e-pošte, koja je stvorena na upravljačkoj ploči hosta, stoga navedite pravu adresu;
- Učitajte sve index.php , protected.php datoteke i sredstva te uključuje mape putem FTP-a na svoj host;
- Dodajte donji kod na svaku PHP stranicu na kojoj želite prikazati obrazac za prijavu;

Require_once "includes/main.php"; $korisnik = novi korisnik(); if(!$user->loggedIn())( preusmjeri("index.php"); )
- Spremni!

Za one koje zanima kako to sve funkcionira, pročitajte u nastavku!

Prvi korak je pisanje HTM koda za autorizacijski obrazac. Ovaj kod koji se nalazi u datoteci index.php. Ova datoteka također sadrži PHP kod koji obrađuje podatke obrazaca i druge korisne funkcije sustava za prijavu. Više o tome možete saznati u odjeljku u nastavku PHP pregled kodirati.

indeks.php

Vodič: Super jednostavan sustav registracije s PHP-om i MySQL-om Prijavite se ili registrirajte

Unesite svoju e-mail adresu iznad i poslat ćemo
imate link za prijavu.

Prijava/Registracija

U odjeljku head (između oznaka i) uključio sam glavne stilove (nisu obuhvaćeni ovim vodičem, pa ih možete pogledati sami. Folder assets/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 gumba "Registracija/Prijava" pomoću funkcije e.preventDefault() i šalje AJAX zahtjeve. Ovisno o odgovoru poslužitelja, prikazuje jednu ili drugu poruku i određuje daljnje radnje/

sredstva/js/script.js

$(function())( var form = $("#login-register"); form.on("submit", function(e)( if(form.is(".loading, .loggedIn"))( return false ; ) var email = form.find("input").val(), messageHolder = form.find("span"); e.preventDefault(); $.post(this.action, (e-mail: email), function (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("loggedIn"); messageHolder . text(m.message); ) )); )); $(document).ajaxStart(function())( form.addClass("loading"); )); $(document).ajaxComplete(function()) ( form. removeClass("učitavanje"); )); ));

je dodan u obrazac za prikaz Trenutna država AJAX zahtjev (ovo je omogućeno zahvaljujući metodama ajaxStart()) I ajaxComplete(), koju možete pronaći pri kraju datoteke).

Ova klasa prikazuje rotirajuću animiranu GIF datoteku (kao da nam nagovještava da se zahtjev obrađuje), a također djeluje kao oznaka za sprječavanje ponovnog slanja obrasca (kada je gumb za registraciju već jednom kliknut). Klasa .loggedIn još je jedna zastavica - postavlja se kada je e-pošta poslana. Ova zastavica odmah blokira sve daljnje radnje s obrascem.

Shema baze podataka

Naš nevjerojatno jednostavan sustav bilježenja koristi 2 MySQL tablice (SQL kod je u datoteci tables.sql). Prvi pohranjuje podatke o korisničkim računima. Drugi pohranjuje podatke o broju pokušaja prijave.


Shema korisničke tablice.

Sustav ne koristi lozinke, kao što se može vidjeti na dijagramu. Na njemu možete vidjeti stupac tokena s tokenima uz stupac token_validity. Token se instalira čim se korisnik spoji na sustav i postavi svoju e-poštu za slanje poruke (više o tome u sljedećem bloku). Stupac token_validity postavlja vrijeme 10 minuta kasnije, nakon čega token više nije valjan.


Shema tablice koja broji broj pokušaja autorizacije.

U obje tablice, IP adresa je pohranjena u obrađenom obliku, korištenjem funkcije ip2long u polju tipa integer.

Sada možemo napisati neki PHP kod. Glavna funkcionalnost sustava dodijeljena je klasi User.class.php koju možete vidjeti ispod.

Ova klasa aktivno koristi idorm (docs), te su knjižnice minimalni potrebni alati za rad s bazama podataka. Upravlja pristupom bazi podataka, generiranjem tokena i provjerom valjanosti tokena. Omogućuje jednostavno sučelje koje olakšava povezivanje sustava za registraciju na vašu stranicu ako koristi PHP.

Korisnik.klasa.php

Class User( // Private ORM case private $orm; /** * Pronađite korisnika prema tokenu. Samo valjani tokeni se prihvaćaju u obzir. Token se generira samo 10 minuta od trenutka kada je kreiran * @param string $token . Ovo je onaj koji tražimo token * @return User Vrati vrijednost korisničke funkcije */ public static function findByToken($token)( // pronađite token u bazi podataka i provjerite je li postavljen točan vremenski žig $rezultat = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("token_validity > NOW()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizirajte ili registrirajte korisnika * @param string $email. Adresa e-pošte korisnika * @return User */ public static function loginOrRegister($email)( // Ako je takav korisnik već postoji, vratite vrijednost funkcije User s navedene adrese e-pošte pohranjene u bazi podataka if(User::exists($email))( return new User($email); ) // U suprotnom, stvorite novog korisnika u bazi podataka i vrati vrijednost funkcije User::create iz navedene e-pošte return User::create($email ); ) /** * Stvorite novog korisnika i spremite u bazu podataka * @param string $email. Adresa e-pošte korisnika * @return User */ private static function create($email)( // Napišite novog korisnika i vratite rezultat korisničke funkcije iz ovih vrijednosti $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Provjerite postoji li takav korisnik u bazi podataka i vratite Booleovu vrijednost varijabla * @param string $email. Adresa e-pošte korisnika * @return boolean */ public static function exists($email)( // Postoji li korisnik u bazi podataka? $result = ORM::for_table("reg_users") ->where("email", $email ) ->count(); return $result == 1; ) /** * Stvorite novi korisnički objekt * @param instanca $param ORM , id, email ili 0 * @return User */ javna funkcija __construct($param = null) ( if($param instanceof ORM)( // ORM provjera prošla $this->orm = $param; ) else if(is_string($param))( // Provjera e-pošte prošla $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // vrijednost varijable $param je proslijeđen korisničkom identifikatoru $id = $param; ) else if(isset($_SESSION["loginid"]))( // Inače, pogledajte sesiju $id = $_SESSION["loginid"]; ) $this->orm = ORM::for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Generiraj novi SHA1 autorizacijski token, zapisuje ga u bazu podataka i vraća njegovu vrijednost * @return string */ public function generateToken( )( // Generiraj token za ovlaštenog korisnika i spremi ga u bazu podataka $token = sha1($this->email.time().rand(0, 1000000)); // Spremite token u bazu 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(NOW(),"0:10")"); $this->orm->save(); vratiti $token; ) /** * Ovlasti korisnika * @return void */ public function login())( // Označi korisnika kao prijavljenog $_SESSION["loginid"] = $this->orm->id; // Ažurirajte vrijednost polja baze podataka last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Uništi sesiju i odjavi korisnika * @return void */ public function logout ()( $_SESSION = array(); unset($_SESSION); ) /** * Provjerite je li korisnik prijavljen * @return boolean */ public function loggedIn())( return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Provjerava je li korisnik administrator * @return boolean */ public funkcija isAdmin())( return $this->rank() = = "administrator"; ) /** * Pronađite tip korisnika, može biti administrator ili regular * @return string */ javna funkcija rank())( ako ($this->orm->rank == 1)( return "administrator" "; ) return "regular"; ) /** * Metoda koja vam omogućuje da dobijete korisnikove privatne podatke kao * svojstva objekta User * @ param string $key Naziv svojstva koje dobiva pristup * @return mixed */ javna funkcija __get($key)( if(isset($this->orm->$key))( return $this->orm-> $ključ; ) vratiti null; ) )

Tokeni se generiraju pomoću SHA1 algoritma i pohranjuju u bazu podataka. Koristim MySQL-ove funkcije za mjerenje vremena za postavljanje vremenskog ograničenja od 10 minuta za valjanost tokena.

Kada je token potvrđen, izravno kažemo rukovatelju da razmatramo samo tokene koji još nisu istekli, pohranjene u stupcu token_validity.

Imajte na umu da koristim čarobnu metodu __dobiti knjižnica dokumenata na kraju datoteke za presretanje pristupa svojstvima objekta User.

Zahvaljujući tome, postaje moguće pristupiti informacijama pohranjenim u bazi podataka zahvaljujući svojstvima $user->email, $user->token, itd. U sljedećem fragmentu koda, pogledat ćemo kako koristiti ove klase kao primjer .


Zaštićena stranica

Druga datoteka koja pohranjuje korisne i potrebne funkcije je datoteka functions.php. Postoji nekoliko takozvanih pomoćnika - pomoćnih funkcija koje vam omogućuju stvaranje čišćeg i čitljivijeg koda u drugim datotekama.

funkcije.php

Funkcija send_email($from, $to, $subject, $message)( // Pomoćnik koji šalje e-poštu $headers = "MIME-Version: 1.0" . "\r\n"; $headers .= "Content-type: text /plain; charset=utf-8" . "\r\n"; $headers .= "From: ".$from . "\r\n"; povratna pošta($to, $subject, $message, $headers ); ) funkcija get_page_url())( // Određivanje URL-a PHP datoteke $url = "http".(empty($_SERVER["HTTPS"])?"":"s")."://" .$_SERVER ["SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) return $url; ) function rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Broj pokušaja prijave po posljednji sat ovom IP adresom $count_hour = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW( ) ,"1:00")") ->count(); // Broj pokušaja prijave u zadnjih 10 minuta za ovu IP adresu $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) - > where_raw("ts > SUBTIME(NOW(),"0:10")") ->count(); if($count_hour > $limit_hour || $count_10_min > $limit_10_min)( throw new Exception("Previše pokušaja prijave!"); ) ) function rate_limit_tick($ip, $email)( // Stvori novi zapis u tablici koji broji broj pokušaja prijave $login_attempt = ORM::for_table("reg_login_attempt")->create(); $login_attempt->email = $email; $login_attempt->ip = sprintf("%u", ip2long($ip )); $login_attempt->save(); ) function redirect($url)( header("Location: $url"); exit; )

Funkcije granica_stope I kvačica_ograničenja_stope pratiti broj pokušaja autorizacije u proteklom vremenskom razdoblju od prvog pokušaja. Pokušaj prijave bilježi se u bazi podataka u stupcu reg_login_attempt. Ove se funkcije pozivaju kada se podaci obrasca obrađuju i šalju kao što možete vidjeti iz sljedećeg isječka koda.

Kod u nastavku preuzet je iz datoteke index.php i upravlja slanjem obrasca. Vraća JSON odgovor, koji zauzvrat obrađuje jQuery u datoteci assets/js/script.js koju smo ranije pogledali.

indeks.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Izlaz zaglavlja JSON zaglavlja("Content-type: application/json"); // Je li ova adresa e-pošte važeća ako (!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))( throw new Exception("Molimo unesite valjanu e-poštu."); ) // Provjerite. Je li korisniku dopuštena prijava, je li premašio broj dopuštenih veza? (datoteka functions.php za više informacija) rate_limit($_SERVER["REMOTE_ADDR"]); // Zabilježi ovaj pokušaj prijave rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["email"]); // Pošalji e-poštu korisniku $message = ""; $email = $_POST["email"]; $subject = "Vaša veza za prijavu"; if(!User:: exists($email) )( $subject = "Hvala na registraciji!"; $message = "Hvala ti za registracija na našoj stranici!\n\n"; ) // Pokušaj autorizirati ili registrirati korisnika $user = User::loginOrRegister($_POST["email"]); $message.= "Možete se prijaviti s ovog URL-a: \n "; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Veza će automatski isteći nakon 10 minuta." ; $result = send_email($fromEmail, $_POST["email"], $subject, $message); if(!$result)( throw new Exception("Došlo je do pogreške prilikom slanja vaše e-pošte. Molimo pokušajte ponovno.") ; ) die (json_encode(array("message" => "Hvala! Poslali smo vam link u pristiglu poštu. Provjerite i mapu neželjene pošte."))); ) ) catch(Iznimka $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage()))); )

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

indeks.php

If(isset($_GET["tkn"]))( // Je li ovaj token valjan za autorizaciju? $user = Korisnik::findByToken($_GET["tkn"]); if($user)( // Da, je. Preusmjeri na zaštićenu stranicu $user->login(); preusmjeri("protected.php"); ) // Ne, token nije valjan. Preusmjeri na stranicu s obrascem za autorizaciju/registraciju preusmjeri("index. php"); )

$user->login()

će stvoriti potrebne varijable za sesiju, tako da će korisnik, koji pregledava sljedeće stranice stranice, ostati ovlašten cijelo vrijeme.

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

indeks.php

If(isset($_GET["logout"]))( $user = new User(); if($user->loggedIn())( $user->logout(); ) redirect("index.php") ;)

Na kraju koda ponovno postavljam preusmjeravanje na index.php, pa parametar ?odjava=1 prenositi putem URL-a nije potrebno.

Naša datoteka index.php zahtijeva dodatne. zaštita - ne želimo da ljudi koji su se prijavili u sustav ponovno vide obrazac za registraciju. U te svrhe koristimo metodu $user->loggedIn().

indeks.php

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

Konačno, ovdje je dio koda koji vam omogućuje da zaštitite stranice svoje stranice i učinite ih dostupnima samo nakon autorizacije.

zaštićeno.php

// Kako biste zaštitili svaku stranicu na svojoj web stranici, uključite datoteku main.php // i stvorite novi objekt User. Tako je to jednostavno! require_once "uključuje/main.php"; $korisnik = novi korisnik(); if(!$user->loggedIn())( redirect("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 pomoću svojstava objekta $korisnik. Za prikaz e-pošte i statusa korisnika koristite ovaj kod:

Echo "Vaša e-pošta: ".$user->email; echo "Vaš rang: ".$user->rank();

metoda rang() ovdje se koristi jer baza podataka obično pohranjuje brojeve (0 za običnog korisnika, 1 za administratora) i te podatke trebamo pretvoriti u statuse kojima pripadaju, u čemu nam ova metoda pomaže.

Da biste običnog korisnika postavili za administratora, jednostavno uredite unos korisnika putem phpMyAdmina (ili bilo kojeg drugog programa koji vam omogućuje upravljanje bazama podataka). Status administratora ne daje nikakve privilegije, uključujući u ovom primjeru stranica će prikazati da ste administrator - i to je to.

Ali što učiniti s ovim prepušteno je vašem nahođenju; možete sami napisati i sastaviti kod koji postavlja određene privilegije i mogućnosti za administratore.

Gotovi smo!

Završili smo s ovim nevjerojatno super kvazi jednostavnim oblikom! Možete ga koristiti na svojim PHP stranicama, vrlo je jednostavan. Također ga možete modificirati za sebe i napraviti ga onako kako želite.

Materijal je pripremio Denis Malyshok posebno za web stranicu

p.s. Želite li napredovati u savladavanju PHP-a i OOP-a? Obratite pozornost na vrhunske lekcije o raznim aspektima izrade web stranica, uključujući programiranje u PHP-u, kao i besplatni tečaj o stvaranju vlastitog CMS sustava u PHP-u od nule pomoću OOP-a:

Svidio vam se materijal i želite mi se zahvaliti?
Samo podijelite sa svojim prijateljima i kolegama!


Nedavno me jedan od mojih posjetitelja zamolio da napišem članak o tome kako registrirati i autorizirati korisnike na stranici. Zapravo, ja ispunjavam njegov zahtjev, au ovom članku ću govoriti o tome kako se to radi.

Postoji nekoliko načina za kreiranje registracije i autorizacije korisnika, ali u ovom ću članku analizirati svoj omiljeni - kroz mehanizam sesije ili kolačića.

Prije svega, ako se želite registrirati na svojoj web stranici, morate razumjeti gdje će se pohranjivati ​​korisnički podaci. Može se skladištiti u normalnom tekstualna datoteka, u XML datoteci ili u bazi podataka. Prve dvije opcije su vrlo opasne, pa vam ne preporučujem da ih koristite. Ali treća opcija - pohranjivanje podataka o korisnicima u bazu podataka - je najpopularnija, a ja vam savjetujem da koristite ovu metodu pohranjivanja informacija.

Odlučili smo se za mjesto skladištenja. Sada prijeđimo izravno na algoritam autorizacije:

  • Napravite obrazac za registraciju u HTML-u.
  • Primite podatke iz obrasca u skripti rukovatelja.
  • Provjerite primljene podatke, a ako su netočni, preusmjerite natrag na obrazac za registraciju.
  • Ako su podaci točni, upišite ih u bazu podataka.
  • To je cijeli proces registracije korisnika na stranici. Odnosno, registracija je spremanje podataka o korisniku na stranici.

    Sljedeća točka je autorizacija korisnika na web mjestu, međutim, prije nego što prijeđem na nju, reći ću vam jednu stvar važna točka u obrascu za registraciju - lozinka. Toplo preporučujem da ne pohranjujete lozinke u otvorena forma(na primjer, "123456"). Obavezno ih šifrirajte, barem pomoću funkcije md5(). I pohranite šifriranu lozinku u bazu podataka.

    Sada autorizacija. Prva stvar koju morate razumjeti je da informacije o autorizaciji moraju biti negdje pohranjene. Najjednostavnija opcija je pohranjivanje informacija u sesiji (ili u kolačiću). A sada algoritam:

  • Napravite obrazac za autorizaciju korisnika u HTML-u, gdje će korisnik morati unijeti svoju prijavu i lozinku.
  • U skripti rukovatelja prihvatite podatke od korisnika. Ako ste me poslušali i pohranite šifrirane lozinke u bazu podataka, prvo šifrirajte dobivenu lozinku. Ako u bazi podataka postoje jasne lozinke, nema potrebe za šifriranjem.
  • Provjerite ispravnost unesenih podataka, te ako se prijava i lozinka podudaraju s postojećim korisnikom u bazi podataka, upišite podatke s prijavom i šifriranom lozinkom (ili otvorite lozinku ako je niste šifrirali) u kolačić ili sesiju.
  • Ako su prijava i/ili lozinka netočno uneseni, preusmjerite se natrag na obrazac za autorizaciju.
  • Sada imate potrebne informacije o autorizaciji korisnika, koje su pohranjene u njegovom kolačiću ili na poslužitelju (ako je sesija). Zapravo, sada morate provjeriti ove podatke na svakoj stranici stranice i potvrditi ih na isti način kao što provjeravate obrazac za autorizaciju. Odnosno, pročitate prijavu i lozinku iz kolačića (sesije) i provjerite je. Ako su točne, onda prikaži jednu stranicu (za registrirane korisnike), a ako su netočne, onda prikaži drugu stranicu (za goste).

    I još nešto za kraj. Kako je napravljen gumb "Izlaz"? Jako jednostavno. Kada kliknete ovaj gumb, kolačić ili sesija se brišu. Dakle, korisnik je automatski izbačen sa stranice.

    Kao što vidite, sve je elementarno, ali kada implementirate ovaj algoritam sigurno ćete imati mnogo pitanja. Na primjer, što učiniti kada registrirate korisnika čija je prijava već u bazi podataka. Implementacija raznih provjera ulaznih podataka, implementacija provjera postojanja e-maila itd. - sve je to prilično složeno ako to radite prvi put. Međutim, ja sam dao sok. Ako imate pitanja tijekom implementacije, postavite ih na forumu ili u komentarima.

    Bok svima. Tako smo naučili nekoliko elemenata za stvaranje oblika. Vrijeme je da udružimo svoje znanje kako bismo riješili veći problem. Kreirajmo najjednostavniji obrazac za autorizaciju na web mjestu. Da bismo to učinili, potrebna su nam dva polja, stvaramo i prilažemo im potpise.

    Prvo polje je za prijavu, drugo je za lozinku. A s drugim nije tako jednostavno. Budući da je to trenutno samo polje za unos teksta.

    Prijaviti se
    Lozinka

    Rezultat u pregledniku:

    Da bi se tekst uneseni u njemu zamijenio zvjezdicama, kao što je uobičajeno za polje ove vrste, morate učiniti jednu jednostavnu radnju. Naime, zamijeniti vrijednost atribut tipa na lozinku:

    Proizlaziti:

    Gumb za slanje obrasca

    Izvoli. Naš obrazac je gotovo spreman. Sada, da biste dovršili njegovu izradu, trebate izraditi gumb koji će se koristiti za slanje obrasca. Problem je riješen pomoću oznake tipa submit.

    Ako gumb treba imati neku vrstu natpisa, onda se to može učiniti pomoću atributa vrijednosti. Na vama je da dodijelite naziv gumbu ili ne; ako to učinite, poslužitelj će primiti to ime, kao i vrijednost gumba.

    U pravilu, naziv gumba za slanje obrasca potreban je kada obrazac ima nekoliko gumba od kojih svaki izvršava određenu radnju. Zahvaljujući tome, poslužitelj, primajući naziv i vrijednost gumba od preglednika, razumije koji je gumb korisnik kliknuo i što, prema tome, treba učiniti.

    Kao rezultat toga, kôd za naš obrazac bit će sljedeći:

    Prijaviti se
    Lozinka

    Rezultat u pregledniku:

    Predstavljam vam vrlo jednostavnu i funkcionalnu skriptu za registraciju i autorizaciju na web mjestu, koja se sastoji od 3 PHP datoteke s vezom 2 java skripte, uz pomoć kojih se greške prikazuju u samom obrascu bez ponovnog učitavanja stranice.

    Skripta je uspješno testirana na PHP verzije 5.3.3 i PHP 5.6.3

    Što skripta može i ima

    • Registrirajte nove korisnike;
    • Autorizirati korisnike i bilježiti kolačiće na određeno razdoblje (nema potrebe za prijavom svaki put);
    • Prikaz i skrivanje određenih informacija za ovlaštene i neovlaštene korisnike;
    • Ima ADMIN PANEL gdje možete uređivati ​​sve podatke i brisati korisnike.

    DEMO i Admin Panels su također tu

    KORAK 1.
    Ako koristite lokalnu registraciju i autorizacijsku skriptu pomoću DENWER-a, tada ne trebate raditi promjene u datotekama za povezivanje na bazu podataka.
    U suprotnom otvorite datoteke: stayt.php, classes/Auth.class.php i adminka/connect.php te na samom vrhu podatke za povezivanje s bazom zamijenite svojima.

    KORAK 2.
    Idite (ako koristite DENWER) na adresu: http://localhost/Tools/phpmyadmin/, ako ste na hostingu, kliknite Databases i kreirajte nova baza s imenom: registr i usporedbom: utf8_general_ci .
    Možete, naravno, postaviti svoje vlastito ime, ali onda ga svakako zamijenite u datotekama za povezivanje s bazom podataka (pogledajte korak 1).

    KORAK 3.
    Kliknite na kreiranu bazu podataka registra i zatim na gornjoj kartici SQL iu prozoru za unos koji se pojavi zalijepite ovaj kod i kliknite OK.

    STVARAJ TABLICU AKO NE POSTOJI `my_users` (`id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `names` varchar(15) NOT NULL, `password` varchar(255) NOT NULL, `salt` varchar(100) NIJE NULL, PRIMARNI KLJUČ (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;

    Svi! Idite na svoju adresu u pregledniku, pokušajte i eksperimentirajte.

    Upravljačka ploča

    Nakon što završite barem jednu registraciju, možete ići u odjeljak ADMIN.
    Prijavite se na ADMIN PANEL:

    http://your_site.ru/adminka/

    Ne zaboravite osigurati ovu mapu i možete je preimenovati.
    Kada otvorite Admin Panel, kliknite na tipku PRETRAŽI i prikazat će vam se svi registrirani korisnici, gdje kada kliknete na određeni ID broj, vidjet ćete korisničke podatke za uređivanje.

    Također možete brzo pronaći korisnika po njegovoj e-pošti; da biste to učinili, samo unesite poznatu e-poštu u polje PRETRAŽIVANJE i kliknite na gumb.
    Ne preporučam korištenje gumba ADD jer se korisnik dodaje u sustav bez lozinke. I nemam pojma zašto su to uopće napravili.

    To je sve, ako ne ide ili nije jasno, postavljajte pitanja.


    U isto vrijeme možete pokušati prodati informacije (proizvode).

    Proces izrade registracijskog sustava je dosta posla. Morate napisati kod koji dvostruko provjerava valjanost adresa e-pošte, šalje potvrdne e-poruke, nudi mogućnost oporavka lozinki, pohranjuje lozinke na sigurno mjesto, provjerava valjanost obrazaca za unos i još mnogo toga. Čak i kada sve ovo napravite, korisnici će se nerado registrirati, jer i najminimalnija registracija zahtijeva njihovu aktivnost.

    U današnjem vodiču, razvijat ćemo jednostavan sustav registracije koji neće zahtijevati nikakve lozinke! Rezultati će biti sustav koji se može lako modificirati ili integrirati u postojeće PHP web mjesto. Ako ste zainteresirani, nastavite čitati.

    PHP

    Sada smo spremni započeti s PHP kodom. Glavnu funkcionalnost registracijskog sustava pruža klasa User koju možete vidjeti u nastavku. Klasa koristi (), što je minimalistička biblioteka baze podataka. Klasa korisnika odgovorna je za pristup bazama podataka, generiranje tokena za prijavu i njihovu provjeru valjanosti. Predstavlja nam jednostavno sučelje koje se lako može ugraditi u sustav registracije vaših web stranica temeljenih na PHP-u.

    Korisnik.klasa.php

    // Privatna ORM instanca
    privatni $orm;

    /**
    * Pronađite korisnika prema nizu tokena. U obzir se uzimaju samo valjani tokeni
    * obzirnost. Token vrijedi 10 minuta nakon što je generiran.
    * @param niz $token Token za traziti
    * @return Korisnik
    */

    Javna statička funkcija findByToken($token)(

    // pronađite u bazi podataka i provjerite je li vremenska oznaka točna


    ->gdje("token", $token)
    ->where_raw("token_validity > NOW()")
    ->nađi_jedan();

    Ako(!$rezultat)(
    vratiti lažno;
    }

    Vrati novog korisnika($result);
    }

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

    Javna statička funkcija loginOrRegister($email)(

    // Ako takav korisnik već postoji, vratite ga

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

    // U suprotnom, kreirajte ga i vratite

    Vrati korisnika::create($email);
    }

    /**
    * Stvorite novog korisnika i spremite ga u bazu podataka
    * @param string $email Adresa e-pošte korisnika
    * @return Korisnik
    */

    Privatna statička funkcija create($email)(

    // Upisati novog korisnika u bazu podataka i vratiti ga

    $result = ORM::for_table("reg_users")->create();
    $rezultat->e-pošta = $e-pošta;
    $rezultat->spremi();

    Vrati novog korisnika($result);
    }

    /**
    * Provjerite postoji li takav korisnik u bazi podataka i vratite booleovu vrijednost.
    * @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_tablicu("reg_users")
    ->gdje("e-pošta", $e-pošta)
    ->count();

    Vrati $result == 1;
    }

    /**
    * Stvorite novi korisnički objekt
    * @param $param ORM instanca, ID, email ili null
    * @return Korisnik
    */

    Javna funkcija __construct($param = null)(

    If($param instanceof ORM)(

    // ORM instanca je proslijeđena
    $this->orm = $param;
    }
    else if(is_string($param))(

    // E-pošta je proslijeđena
    $ovo->
    ->gdje("e-pošta", $param)
    ->nađi_jedan();
    }
    drugo(

    If(is_numeric($param))(
    // Korisnički ID 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::for_table("reg_users")
    ->gdje("id", $id)
    ->nađi_jedan();
    }

    /**
    * Generira novi SHA1 token za prijavu, zapisuje ga u bazu podataka i vraća.
    * @povratni niz
    */

    Javna funkcija generirajToken())(
    // generiraj token za prijavljenog korisnika. Spremite ga u bazu podataka.

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

    // Spremite token u bazu podataka,
    // i označite ga kao valjanog samo sljedećih 10 minuta

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

    Vrati $token;
    }

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

    Javna funkcija login()

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

    // Ažurirajte last_login db polje
    $this->orm->set_expr("last_login", "NOW()");
    $this->orm->save();
    }

    /**
    * Uništi sesiju i odjavi korisnika.
    * @return void
    */

    Odjava iz javne funkcije()
    $_SESIJA = niz();
    poništi($_SESSION);
    }

    /**
    * Provjerite je li korisnik prijavljen.
    * @return Boolean
    */

    Javna funkcija loggedIn())(
    return 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 vrstu korisnika. Može biti admin ili regular.
    * @povratni niz
    */

    Rang javne funkcije())(
    if($this->orm->rank == 1)(
    vrati "administrator";
    }

    Vrati "regular";
    }

    /**
    * Čarobna metoda za pristup elementima privatnog
    * $orm instanca kao svojstva korisničkog objekta
    * @param string $key Naziv svojstva kojem se pristupa
    * @return miješano
    */

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

    Vrati null;
    }
    }
    Tokeni se generiraju pomoću algoritma i pohranjuju u bazu podataka. Koristimo MySQL za postavljanje stupca token_validity na 10 minuta. Prilikom provjere valjanosti tokena, kažemo motoru da nam treba token, polje token_validity još nije isteklo. Na taj način ograničavamo vrijeme tijekom kojeg će token vrijediti.

    Primijetite da koristimo čarobnu metodu __get() na kraju dokumenta za pristup svojstvima korisničkog objekta. To nam omogućuje pristup podacima koji su pohranjeni u bazi podataka kao svojstva: $user->email, $user->token. Kao primjer, pogledajmo 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 bude uredniji.

    Funkcije.php

    Funkcija send_email($from, $to, $subject, $message)(

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

    $headers = "MIME-verzija: 1.0" . "\r\n";
    $headers .= "Content-type: text/plain; charset=utf-8" . "\r\n";
    $headers .= "Od: ".$od . "\r\n";

    Povratna pošta ($to, $subject, $message, $headers);
    }

    funkcija get_page_url())(

    // Pronađite URL PHP datoteke

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

    If(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")(
    $url.= $_SERVER["REQUEST_URI"];
    }
    drugo(
    $url.= $_SERVER["PATH_INFO"];
    }

    Vrati $url;
    }

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

    // Broj pokušaja prijave u zadnjih sat vremena s ove IP adrese

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

    // Broj pokušaja prijave u zadnjih 10 minuta s ove IP adrese

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

    If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
    throw new Exception("Previše pokušaja prijave!");
    }
    }

    funkcija rate_limit_tick($ip, $email)(

    // Napravi novi zapis u tablici pokušaja prijave

    $login_attempt = ORM::for_table("reg_login_attempt")->create();

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

    $login_attempt->save();
    }

    funkcija redirect($url)(
    zaglavlje("Lokacija: $url");
    Izlaz;
    }
    Funkcije rate_limit i rate_limit_tick omogućuju nam da ograničimo broj pokušaja autorizacije za određeno vremensko razdoblje. Pokušaji autorizacije bilježe se u bazi podataka reg_login_attempt. Ove se funkcije pokreću kada se obrazac za prijavu potvrdi, kao što možete vidjeti u sljedećem isječku koda.

    Donji kod preuzet je s index.php i odgovoran je za provjeru valjanosti obrasca za prijavu. Vraća JSON odgovor koji je vođen jQuery kodom koji smo vidjeli u assets/js/script.js.

    indeks.php

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

    // Izlaz JSON zaglavlja

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

    // Je li adresa e-pošte važeća?

    If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
    throw new Exception("Molimo unesite valjanu e-poštu.");
    }

    // Ovo će izbaciti iznimku ako je osoba iznad
    // dopuštena 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-mail"]);

    // Pošaljite poruka korisniku

    $poruka = ​​"";
    $e-pošta = $_POST["e-pošta"];
    $subject = "Vaša veza za prijavu";

    If(!Korisnik::postoji($email))(
    $subject = "Hvala na registraciji!";
    $message = "Hvala što ste se registrirali na našoj stranici!\n\n";
    }

    // Pokušajte se prijaviti ili registrirati osobu
    $user = Korisnik::loginOrRegister($_POST["e-pošta"]);

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

    $message.= "Veza će automatski isteći nakon 10 minuta.";

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

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

    Die(json_encode(array(
    "message" => "Hvala! Poslali smo vam link u inbox. Također provjerite mapu s neželjenom poštom."
    )));
    }
    }
    catch(iznimka $e)(

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

    indeks.php

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

    // Je li ovo važeći token za prijavu?
    $user = Korisnik::findByToken($_GET["tkn"]);

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

    $korisnik->prijava();
    preusmjeravanje("protected.php");
    }

    // Pogrešan token. Preusmjeri natrag na obrazac za prijavu.
    preusmjeravanje("index.php");
    }
    Pokretanje $user->login() stvorit će potrebne varijable sesije, dopuštajući korisniku da ostane prijavljen pri sljedećim prijavama.

    Odjava iz sustava provodi se na približno isti način:

    Indeks.php

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

    $korisnik = novi korisnik();

    If($user->loggedIn())(
    $korisnik->odjava();
    }

    Preusmjeri("index.php");
    }
    Na kraju koda ponovno preusmjeravamo korisnika na index.php, tako da je parametar ?logout=1 u URL-u eliminiran.

    Našoj datoteci index.php također će trebati zaštita - već je ne želimo ovlašteni korisnici vidio formu. Da bismo to učinili koristimo metodu $user->loggedIn():

    Indeks.php

    $korisnik = novi korisnik();

    if($user->loggedIn())(
    preusmjeravanje("protected.php");
    }
    Na kraju, pogledajmo kako možete zaštititi svoju web stranicu i učiniti je dostupnom samo nakon autorizacije:

    zaštićeno.php

    // Kako biste zaštitili bilo koju php stranicu na svojoj web stranici, uključite main.php
    // i kreirajte novi objekt User. Tako je jednostavno!

    require_once "uključuje/main.php";

    $korisnik = novi korisnik();

    if(!$user->loggedIn())(
    preusmjeravanje("index.php");
    }
    Nakon ove provjere možete biti sigurni da se korisnik uspješno prijavio. Također ćete imati pristup podacima koji su pohranjeni u bazi podataka kao svojstva objekta $user. Za prikaz e-pošte korisnika i njegovog ranga upotrijebite sljedeći kod:

    Echo "Vaša e-pošta: ".$user->email;
    echo "Vaš rang: ".$user->rank();
    Ovdje je rank() metoda jer stupac ranga u bazi podataka obično sadrži brojeve (0 za obične korisnike i 1 za administratore) i sve to moramo pretvoriti u nazive rangova, što se implementira ovom metodom. Da biste standardnog korisnika pretvorili u administratora, jednostavno uredite unos korisnika u phpmyadmin (ili bilo kojem drugom programu baze podataka). Kao administrator, korisnik neće imati nikakva prava posebne značajke. Sami imate pravo odabrati koja prava ćete dodijeliti administratorima.

    Spreman!

    Time je naš jednostavan sustav registracije spreman! Možete ga koristiti na postojećem PHP mjestu ili ga modernizirati kako bi odgovarao vašim zahtjevima.

    Najbolji članci na temu