Registrácia výkonného php. Vytvorenie neuveriteľne jednoduchého registračného systému s PHP a MySQL

  • 04.06.2019

Reg.ru: domény a hosting

Najväčší registrátor a poskytovateľ hostingu v Rusku.

V prevádzke je viac ako 2 milióny doménových mien.

Propagácia, mail pre doménu, riešenia pre podnikanie.

Svoj výber si už vybralo viac ako 700 tisíc zákazníkov po celom svete.

*Presunutím myšou pozastavíte rolovanie.

Späť dopredu

Vytvorenie jednoduchého systému registrácie používateľov v PHP a MySQL

Vytvorenie registračného systému je veľa práce. Musíte napísať kód, ktorý overí e-mailové adresy, odošle potvrdzovací e-mail, overí ďalšie polia formulára a oveľa viac.

A aj keď toto všetko napíšete, používatelia sa budú zdráhať registrovať, pretože. vyžaduje si to určité úsilie z ich strany.

V tomto návode vytvoríme veľmi jednoduchý prihlasovací systém, ktorý vôbec nevyžaduje ani neukladá heslá! Výsledok bude možné ľahko upraviť a pridať na už existujúcu stránku PHP. Chcete zistiť, ako to funguje? Prečítajte si nižšie.



Náš super jednoduchý systém by fungoval takto:

Spojíme autorizačný formulár a registráciu. Tento formulár bude obsahovať pole na zadanie e-mailovej adresy a tlačidlo registrácie;
- Pri vyplnení poľa emailovou adresou sa kliknutím na tlačidlo registrácie vytvorí záznam o novom užívateľovi, avšak len v prípade, že zadaná emailová adresa nebola nájdená v databáze.

Potom sa vytvorí náhodná jedinečná sada znakov (token), ktorá sa odošle na poštu určenú používateľom vo forme odkazu, ktorý bude relevantný 10 minút;
- Kliknutím na odkaz prejde používateľ na našu webovú stránku. Systém určí prítomnosť tokenu a autorizuje používateľa;

Výhody tohto prístupu:

Nie je potrebné ukladať heslá a overovať polia;
- Nie je potrebné obnovenie hesla, tajné otázky atď.;
- Od momentu registrácie/prihlásenia používateľa si môžete byť vždy istý, že tento používateľ bude vo vašej prístupovej zóne (že e-mailová adresa je pravdivá);
- Neuveriteľne jednoduchý proces registrácie;

Nevýhody:

Zabezpečenie používateľského účtu. Ak má niekto prístup k pošte používateľa, môže sa prihlásiť.
- E-mail nie je bezpečný a možno ho zachytiť. Majte na pamäti, že táto otázka je relevantná aj v prípade, keď bolo heslo zabudnuté a je potrebné ho obnoviť, alebo v akomkoľvek autorizačnom systéme, ktorý nepoužíva HTTPS na prenos dát (login / heslo);
- Pokiaľ nastavíte poštový server podľa potreby, existuje šanca, že správy s autorizačnými odkazmi skončia v spame;

Pri porovnaní výhod a nevýhod nášho systému môžeme konštatovať, že systém má vysokú využiteľnosť (maximálny komfort pre koncového užívateľa) a zároveň má nízky bezpečnostný indikátor.

Preto sa navrhuje používať ho na registrácie na fórach a službách, ktoré nepracujú s dôležitými informáciami.

Ako používať tento systém

V prípade, že potrebujete iba použiť systém na autorizáciu používateľov na vašej lokalite a nechcete túto lekciu rozoberať, musíte urobiť nasledovné:

Musíte si stiahnuť zdrojové súbory priložené k lekcii
- Nájdite súbor v archíve tables.sql Importujte ho do svojej databázy pomocou možnosti importu v phpMyAdmin. Alternatívny spôsob: otvorte tento súbor v textovom editore, skopírujte SQL dotaz a spustite ho;
- Otvorené obsahuje/main.php a vyplňte nastavenia pre pripojenie k vašej databáze (uveďte používateľa a heslo pre pripojenie k databáze, ako aj hostiteľa a názov databázy). V tom istom súbore musíte zadať aj e-mailovú adresu, ktorá sa použije ako pôvodná adresa pre správy odoslané systémom. Niektorí hostitelia budú blokovať odchádzajúce e-maily, kým sa vo formulári nezobrazí skutočná e-mailová adresa, ktorá bola vytvorená z ovládacieho panela hostiteľa, takže zadajte skutočnú adresu;
- Stiahnite si všetky súbory index.php, protected.php a aktíva a zložky cez FTP do vášho hostiteľa;
- Pridajte nižšie uvedený kód na každú stránku PHP, kde chcete zobraziť autorizačný formulár;

Require_once "includes/main.php"; $user = novy User(); if(!$user->loggedIn())( redirect("index.php"); )
- Pripravený!

Pre tých, ktorých zaujíma, ako to celé funguje, čítajte ďalej!

Prvým krokom je napísanie HTM kódu pre autorizačný formulár. Tento kód sa nachádza v súbore index.php. Tento súbor obsahuje aj PHP kód, ktorý spracováva údaje formulára a ďalšie užitočné funkcie autorizačného systému. Viac sa o tom môžete dozvedieť v sekcii kontroly kódu PHP nižšie.

index.php

Návod: Super jednoduchý registračný systém s PHP a MySQL

Prihláste sa alebo Registrujte sa

Vyššie zadajte svoju e-mailovú adresu a my vám pošleme
odkaz na prihlásenie.



V sekcii hlavy (medzi značkami A) Zahrnul som hlavné štýly (v tomto návode nie sú analyzované, takže si ich môžete pozrieť sami. Priečinok aktív/css/style.css). Pred záverečnou značkou

Zahrnul som knižnicu jQuery a súbor script.js, ktoré napíšeme a analyzujeme nižšie.


JavaScript

jQuery sleduje stav tlačidla „Zaregistrovať sa/Prihlásiť sa“ s funkciou e.preventDefault() a odosiela požiadavky AJAX. V závislosti od odpovede servera zobrazí konkrétnu správu a určí ďalšie akcie /

aktíva/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), funkcia (m)( if(m.error)( form.addClass("error"); messageHolder.text(m.message); ) else( form.removeClass("error").addClass("prihlásené"); messageHolder. text(m.message); ) )); )); $(document).ajaxStart(function()( form.addClass("načítava"); )); $(document).ajaxComplete(function()(form. removeClass("načítavam"); ​​)); ));

bol do formulára pridaný na zobrazenie aktuálneho stavu požiadavky AJAX (toto bolo možné vďaka metódam ajaxStart()) A ajaxComplete(), ktorý nájdete na konci súboru).

Táto trieda zobrazuje otáčajúci sa animovaný súbor gif (akoby nám naznačoval, že požiadavka sa spracováva) a tiež funguje ako príznak, ktorý zabraňuje opätovnému odoslaniu formulára (keď sa už raz kliklo na tlačidlo registrácie). Trieda .prihlásený- toto je iný príznak - nastavený pri odoslaní e-mailu. Tento príznak okamžite zablokuje akúkoľvek ďalšiu akciu vo formulári.

Schéma databázy

Náš neuveriteľne jednoduchý systém protokolovania používa 2 tabuľky MySQL (kód SQL je v súbore tables.sql). Prvý ukladá údaje o používateľských účtoch. V druhom sú uložené informácie o počte pokusov o prihlásenie.


Schéma užívateľskej tabuľky.

Systém nepoužíva heslá, čo je vidieť na diagrame. Na ňom môžete vidieť stĺpec žetón so žetónmi susediacimi so stĺpcom platnosť_tokenu. Token sa nastaví hneď, ako sa používateľ pripojí k systému, nastaví svoj e-mail na odoslanie správy (o tom trochu viac v ďalšom bloku). Stĺpec platnosť_tokenu nastaví čas o 10 minút neskôr, po ktorom už token nie je platný.


Schéma tabuľky, ktorá počíta počet pokusov o autorizáciu.

V oboch tabuľkách je IP adresa uložená v spracovanej forme pomocou funkcie ip2long v celočíselnom poli.

Teraz môžeme napísať nejaký PHP kód. Hlavná funkcionalita systému je priradená triede user.class.php ktoré môžete vidieť nižšie.

Táto trieda aktívne využíva idorm (docs), tieto knižnice sú minimom nevyhnutných nástrojov pre prácu s databázami. Zaoberá sa prístupom k databáze, generovaním tokenov a validáciou. Je to jednoduché rozhranie, ktoré uľahčuje pripojenie registračného systému k vašej stránke, ak používa PHP.

user.class.php

Class User( // Private ORM case private $orm; /** * Vyhľadanie používateľa podľa tokenu. Do úvahy sa berú iba platné tokeny. Token sa generuje iba 10 minút od okamihu, keď bol vytvorený * @param string $token . Toto je ten, ktorý hľadáte token * @return User. Vráťte hodnotu funkcie Používateľ */ verejná statická funkcia findByToken($token)( // nájdite token v databáze a uistite sa, že je nastavená správna časová pečiatka $ vysledok = ORM::for_table("reg_users") ->where ("token", $token) ->where_raw("platnost_tokenu > TERAZ()") ->find_one(); if(!$result)( return false; ) return new User($result); ) /** * Autorizácia alebo registrácia používateľa * @param string $email.E-mailová adresa používateľa * @return User */ verejná statická funkcia loginOrRegister($email)( // Ak takýto používateľ už existuje, vráťte hodnotu funkcie Používateľ zo zadanej e-mailovej adresy uloženej v databáze if(User::exists($email))( return new User($email); ) // V opačnom prípade vytvorte nového používateľa tel v databáze a vráti hodnotu funkcie User::create zo zadaného emailu return User::create($email); ) /** * Vytvorenie nového užívateľa a uloženie do databázy * @param string $email. E-mailová adresa používateľa * @return User */ súkromná statická funkcia create($email)( // Zaregistrujte nového používateľa a vráťte výsledok funkcie používateľa z týchto hodnôt $result = ORM::for_table("reg_users")- >create(); $result->email = $email; $result->save(); return new User($result); ) /** * Skontrolujte, či takýto používateľ existuje v databáze a vráťte boolovskú hodnotu premenná * @param reťazec $email. E-mailová adresa používateľa * @return boolean */ existuje verejná statická funkcia ($email)( // Existuje používateľ v databáze? $result = ORM::for_table("reg_users") ->where("e-mail", $email ) ->count(); return $result == 1; ) /** * Vytvorenie nového používateľského objektu * @param inštancia $param ORM , id, email alebo 0 * @return User */ verejná funkcia __construct($param = null) ( if($param instanceof ORM)( // kontrola ORM prebehla $this->orm = $param; ) else if(is_string($param))( // Kontrola e-mailu prebehla $this->orm = ORM:: for_table ("reg_users") ->where("email", $param) ->find_one(); ) else( $id = 0; if(is_numeric($param))( // ID používateľa je odovzdaná hodnota $ param premenná $id = $param; ) else if(isset($_SESSION["loginid"]))( // Inak pozri reláciu $id = $_SESSION["loginid"]; ) $this->orm = ORM:: for_table( "reg_users") ->where("id", $id) ->find_one(); ) ) /** * Vygenerujte nový autorizačný token SHA1, píše do databázy a vráti svoju hodnotu * @return string */ verejná funkcia vygenerovaťToken()( // Vygenerovať token pre oprávneného používateľa a uložiť ho do databázy $token = sha1($this->email.time().rand (0,1000000)); // Uložte token do databázy // A označte ho ako platný iba na nasledujúcich 10 minút $this->orm->set("token", $token); $this->orm->set_expr("platnosť_tokenu", "ADDTIME(NOW(),"0:10")"); $this->orm->save(); vrátiť $token; ) /** * Autorizácia používateľa * @return void */ public function login()( // Označenie používateľa ako prihláseného $_SESSION["loginid"] = $this->orm->id; // Aktualizácia hodnoty databázového poľa last_login $this->orm->set_expr("last_login", "NOW()"); $this->orm->save(); ) /** * Zničiť reláciu a odhlásiť používateľa * @return void */ odhlásenie z verejnej funkcie ()( $_SESSION = array(); unset($_SESSION); ) /** * Skontrolujte, či je používateľ prihlásený * @return boolean */ verejná funkcia prihlásený()( return isset($) this->orm->id) && $_SESSION["loginid"] == $this->orm->id; ) /** * Skontrolujte, či je používateľ správcom * @return boolean */ public function isAdmin() ( return $this->rank() = = "administrator"; ) /** * Nájdite typ používateľa, môže to byť správca alebo bežný * @reťazec návratu */ public function rank()( if($this->orm- >rank == 1)( return "administrator"; ) return "regular"; ) /** * Metóda, ktorá vám umožňuje získať súkromné ​​informácie * ako vlastnosti objektu používateľa * @param string $key Názov vlastnosti, ku ktorej sa pristupuje * @return mixed */ public function __get($key)( if(isset($this->orm->$key)) ( return $this->orm->$key; ) return null; ))

Tokeny sa generujú pomocou algoritmu SHA1 a ukladajú sa do databázy. Používam časové funkcie MySQL na nastavenie 10-minútového limitu vypršania platnosti tokenu.

Keď token prejde overovacou procedúrou, priamo informujeme obsluhu, že berieme do úvahy len tokeny, ktorým ešte neskončila platnosť, uložené v stĺpci token_validity.

Upozorňujeme, že používam magickú metódu __získať knižnicu dokumentov na konci súboru na zachytenie prístupu k vlastnostiam objektu používateľa.

Vďaka tomu je možné vďaka vlastnostiam pristupovať k informáciám uloženým v databáze $user->e-mail, $user->token atď. V nasledujúcom úryvku kódu si uveďme príklad použitia týchto tried.


Chránená stránka

Ďalším súborom, v ktorom sú uložené užitočné a potrebné funkcie, je súbor funkcie.php. Nachádza sa tu niekoľko takzvaných pomocníkov – pomocných funkcií, ktoré umožňujú vytvárať čistejší a čitateľnejší kód v iných súboroch.

funkcie.php

Funkcia send_email($from, $to, $subject, $message)( // Pomocník, ktorý odosiela e-maily $headers = "MIME-Verzia: 1.0" . "\r\n"; $headers .= "Typ obsahu: text /plain; charset=utf-8" . "\r\n"; $headers .= "Od: ".$from . "\r\n"; vrátiť poštu($to, $predmet, $správa, $hlavičky ); ) function get_page_url()( // Získanie URL súboru PHP $url = "http".(prázdne($_SERVER["HTTPS"])?"":"s")."://".$_SERVER [ "SERVER_NAME"]; if(isset($_SERVER["REQUEST_URI"]) && $_SERVER["REQUEST_URI"] != "")( $url.= $_SERVER["REQUEST_URI"]; ) else( $url. = $_SERVER["PATH_INFO"]; ) návrat $url; ) funkcia rate_limit($ip, $limit_hour = 20, $limit_10_min = 10)( // Počet pokusov o prihlásenie za poslednú hodinu na tejto IP adrese $count_hour = ORM: :for_table("reg_login_attempt") ->where("ip", sprintf("%u", ip2long($ip))) ->where_raw("ts > SUBTIME(NOW(),"1:00")") ->count(); // Počet pokusov o prihlásenie za posledných 10 minút na tejto IP adrese $count_10_min = ORM::for_table("reg_login_attempt") ->where("ip", sprint f("%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("Príliš veľa pokusov o prihlásenie!"); ) ) funkcia rate_limit_tick($ip, $email)( // Vytvorenie nového záznamu v tabuľke počítanie počtu pokusov o prihlásenie $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; )

Funkcie sadzba_limit A rate_limit_tick sledovať počet pokusov o autorizáciu za časové obdobie, ktoré uplynulo od prvého pokusu. Pokus o prihlásenie sa zaznamená do databázy v stĺpci reg_login_attempt. Tieto funkcie sa volajú pri spracovávaní a odosielaní údajov formulára, ako môžete vidieť v nasledujúcom útržku kódu.

Nižšie uvedený kód je prevzatý zo súboru index.php a spracováva odoslanie formulára. Vracia odpoveď JSON, ktorá je následne spracovaná jQuery v súbore aktíva/js/script.js o ktorých sme už hovorili skôr.

index.php

Try( if(!empty($_POST) && isset($_SERVER["HTTP_X_REQUESTED_WITH"]))( // Výstup hlavičky JSON("Content-type: application/json"); // Je táto e-mailová adresa platná, ak (!isset($_POST["e-mail"]) || !filter_var($_POST["e-mail"], FILTER_VALIDATE_EMAIL))( throw new Exception("Zadajte platný e-mail."); ) // Skontrolujte. Je používateľ sa môže prihlásiť, prekročil počet povolených pripojení? (viac informácií v súbore functions.php) rate_limit($_SERVER["REMOTE_ADDR"]); // Zaznamenať tento pokus o prihlásenie rate_limit_tick($_SERVER["REMOTE_ADDR"] , $ _POST["e-mail"]); // Odoslať e-mail používateľovi $message = ""; $email = $_POST["e-mail"]; $subject = "Váš odkaz na prihlásenie"; if(!User:: existuje($email) )( $subject = "Ďakujeme za registráciu!"; $message = "Ďakujeme za registráciu na našej stránke!\n\n"; ) // Pokus o autorizáciu alebo registráciu používateľa $user = Používateľ ::loginOrRegister($_POST[ "e-mail"]); $message.= "Môžete sa prihlásiť z tejto adresy URL:\n" ; $message.= get_page_url()."?tkn=".$user->generateToken()."\n\n"; $message.= "Platnosť odkazu vyprší automaticky po 10 minútach."; $vysledok = send_email($fromEmail, $_POST["e-mail"], $predmet, $sprava); if(!$result)( throw new Exception("Pri odosielaní vášho e-mailu sa vyskytla chyba. Skúste to znova."); ) die(json_encode(array("message" => "Ďakujeme! Poslali sme odkaz) do svojej doručenej pošty. Skontrolujte si aj priečinok so spamom.")))); ) ) catch(Exception $e)( die(json_encode(array("error"=>1, "message" => $e->getMessage( )))))

Po úspešnej autorizácii/registrácii pošle vyššie uvedený kód užívateľovi odkaz na autorizáciu. Token sa stáva dostupným, pretože je odovzdaná ako premenná vo vygenerovanom odkaze metódou $_GET s fixkou tkn

index.php

If(isset($_GET["tkn"]))( // Je tento token platný na autorizáciu? $user = User::findByToken($_GET["tkn"]); if($user)( // Áno , je. Presmerujte na chránenú stránku $user->login(); redirect("protected.php"); ) // Nie, token nie je platný. Presmerujte na stránku s prihlasovacím/registračným formulárom redirect("index. php");)

$user->login()

vytvorí potrebné premenné pre reláciu, takže používateľ, ktorý si prezerá nasledujúce stránky lokality, zostane po celý čas autorizovaný.

Podobne je usporiadané spracovanie funkcie na ukončenie systému.

index.php

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

Na konci kódu som opäť presmeroval na index.php, teda parameter ?logout=1 odovzdaný URL nie je povinný.

Náš súbor index.php vyžaduje dodatočné ochrana - nechceme, aby ľudia, ktorí sa niekedy prihlásili do systému, znova videli registračný formulár. Na tieto účely používame metódu $user->loggedIn().

index.php

$user = novy User(); if($user->loggedIn())( redirect("protected.php"); )

Nakoniec je tu kúsok kódu, ktorý vám umožňuje chrániť stránky vášho webu a sprístupniť ho až po autorizácii.

protected.php

// Na zabezpečenie každej stránky na vašom webe zahrňte súbor // main.php a vytvorte nový objekt používateľa. Takto je to jednoduché! require_once "includes/main.php"; $user = novy User(); if(!$user->loggedIn())( redirect("index.php"); )

Po tejto kontrole si môžete byť istí, že používateľ bol úspešne autorizovaný. K uloženým informáciám v databáze môžete pristupovať aj pomocou vlastností objektu $user. Ak chcete zobraziť e-mail a stav používateľa, použite tento kód:

echo "Váš email: ".$user->e-mail; echo "Vaša hodnosť: ".$user->rank();

Metóda rank() sa tu používa preto, lebo čísla sú väčšinou uložené v databáze (0 pre bežného užívateľa, 1 pre administrátora) a tieto údaje potrebujeme previesť do stavov, do ktorých patria, v čom nám tento spôsob pomáha.

Ak chcete z bežného používateľa urobiť administrátora, jednoducho upravte záznam používateľa cez phpMyAdmin (alebo akýkoľvek iný program, ktorý vám umožňuje spravovať databázy). Stav správcu nedáva žiadne privilégiá, v tomto príklade sa na stránke zobrazí, že ste správcom – a to je všetko.

Ale čo s tým - zostáva na vašom uvážení, môžete sami napísať a zostaviť kód, ktorý nastaví určité privilégiá a príležitosti pre správcov.

Skončili sme!

S týmto neuveriteľne super kvázi jednoduchým tvarom máme hotovo! Môžete ho použiť na svojich PHP stránkach, je to celkom jednoduché. Môžete si ho tiež upraviť pre seba a urobiť tak, ako chcete.

Materiál pripravil Denis Malyshok špeciálne pre túto stránku

P.S. Chcete sa posunúť ďalej v ovládaní PHP a OOP? Pozrite si prémiové tutoriály o rôznych aspektoch tvorby webových stránok vrátane programovania PHP, ako aj bezplatný kurz budovania systému PHP CMS od nuly pomocou OOP:

Páčil sa vám materiál a chcete sa poďakovať?
Stačí zdieľať so svojimi priateľmi a kolegami!


Proces vytvárania registračného systému je pomerne veľa práce. Musíte napísať kód, ktorý kontroluje platnosť e-mailových adries, odosiela potvrdzovacie e-maily, ponúka obnovenie hesla, ukladá heslá na bezpečné miesto, overuje vstupné formuláre a ďalšie. Aj keď toto všetko urobíte, používatelia sa budú zdráhať registrovať, pretože aj tá najmenšia registrácia si vyžaduje ich aktivitu.

V dnešnom návode vyvinieme jednoduchý prihlasovací systém, kde nepotrebujete žiadne heslá! V dôsledku toho získame systém, ktorý je možné jednoducho upraviť alebo integrovať do existujúcej stránky PHP. Ak máte záujem, pokračujte v čítaní.

PHP

Teraz sme pripravení prejsť na kód PHP. Hlavnú funkcionalitu registračného systému zabezpečuje trieda Používateľ, ktorú môžete vidieť nižšie. Trieda používa (), čo je minimalistická databázová knižnica. Trieda User je zodpovedná za prístup k databázam, generovanie tokenov na prihlásenie a ich overovanie. Poskytuje nám jednoduché rozhranie, ktoré možno ľahko začleniť do registračného systému na vašich stránkach založených na PHP.

user.class.php

// Súkromná inštancia ORM
súkromný $orm;

/**
* Nájdite používateľa podľa reťazca tokenov. Do úvahy sa berú iba platné tokeny
* úvaha. Token je platný 10 minút po jeho vygenerovaní.
* @param string $token Token, ktorý sa má vyhľadať
* @returnUser
*/

verejná statická funkcia findByToken($token)(

// nájdite ho v databáze a uistite sa, že časová pečiatka je správna


->where("token", $token)
->where_raw("platnosť_tokenu > TERAZ()")
->najd_jeden();

If(!$result)(
vrátiť nepravdu;
}

Vrátiť nového používateľa ($výsledok);
}

/**
* Buď sa prihláste alebo zaregistrujte používateľa.
* @returnUser
*/

Verejná statická funkcia loginOrRegister($email)(

// Ak takýto používateľ už existuje, vráťte ho

If(User::exists($email))(
vrátiť nového používateľa ($email);
}

// V opačnom prípade ho vytvorte a vráťte

Návrat používateľa::create($email);
}

/**
* Vytvorte nového používateľa a uložte ho do databázy
* @param string $email E-mailová adresa používateľa
* @returnUser
*/

Vytvorenie súkromnej statickej funkcie ($email)(

// Zapíšte nového užívateľa do databázy a vráťte ho

$vysledok = ORM::for_table("reg_users")->vytvor ();
$vysledok->email = $email;
$vysledok->ulozit();

Vrátiť nového používateľa ($výsledok);
}

/**
* Skontrolujte, či takýto používateľ existuje v databáze a vráťte boolovskú hodnotu.
* @param string $email E-mailová adresa používateľa
* @return boolean
*/

Verejná statická funkcia existuje($email)(

// Existuje používateľ v databáze?
$result = ORM::for_table("reg_users")
->where("e-mail", $email)
->count();

return $vysledok == 1;
}

/**
* Vytvorte nový používateľský objekt
* @param $param inštancia ORM, id, e-mail alebo null
* @returnUser
*/

Verejná funkcia __construct($param = null)(

If($param instanceof ORM)(

// Inštancia ORM bola odovzdaná
$this->orm = $param;
}
else if(is_string($param))(

// E-mail bol odoslaný
$this->
->where("e-mail", $param)
->najd_jeden();
}
inak(

If(is_numeric($param))(
// Ako parameter bolo odovzdané ID používateľa
$id = $param;
}
else if(isset($_SESSION["loginid"]))(

// Nebolo odovzdané žiadne ID používateľa, pozrite sa do relácie
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->where("id", $id)
->najd_jeden();
}

/**
* Vygeneruje nový prihlasovací token SHA1, zapíše ho do databázy a vráti.
* @reťazec návratu
*/

Verejná funkcia createToken()(
// vygeneruje token pre prihláseného používateľa. Uložte ho do databázy.

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

// Uložte token do databázy,
// a označte ho ako platný len na nasledujúcich 10 minút

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

Vrátiť $token;
}

/**
* Prihláste tohto používateľa
* @return void
*/

prihlásenie do verejnej funkcie()(

// Označte používateľa ako prihláseného
$_SESSION["loginid"] = $this->orm->id;

// Aktualizácia poľa databázy last_login
$this->orm->set_expr("last_login", "TERAZ()");
$this->orm->save();
}

/**
* Zničte reláciu a odhláste používateľa.
* @return void
*/

odhlásenie verejnej funkcie()(
$_SESSION = pole ();
unset($_SESSION);
}

/**
* Skontrolujte, či je používateľ prihlásený.
* @return boolean
*/

Verejná funkcia prihlásený()(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Skontrolujte, či je používateľ správcom
* @return boolean
*/

Verejná funkcia isAdmin()(
return $this->rank() == "administrator";
}

/**
* Nájdite typ používateľa. Môže to byť buď admin alebo obyčajný.
* @reťazec návratu
*/

verejná funkcia rank()(
if($this->orm->rank == 1)(
vrátiť "správca";
}

Návrat "pravidelný";
}

/**
* Magická metóda pre prístup k prvkom súkromia
* $orm inštancia ako vlastnosti objektu užívateľa
* @param string $key Názov sprístupnenej vlastnosti
* @návrat zmiešaný
*/

Verejná funkcia __get($key)(
if(isset($this->orm->$key))(
return $this->orm->$key;
}

return null;
}
}
Tokeny sa generujú pomocou algoritmu a ukladajú sa do databázy. Z MySQL používame na nastavenie hodnoty v stĺpci token_validity na 10 minút. Pri validácii tokenu povieme enginu, že potrebujeme token, pole token_validity ešte nevypršalo. Obmedzujeme tak dobu, počas ktorej bude token platný.

Všimnite si, že na prístup k vlastnostiam objektu používateľa používame metódu magic __get() na konci dokumentu. To nám umožňuje pristupovať k údajom uloženým v databáze ako vlastnosti: $user->email, $user->token. Pozrime sa ako príklad, ako môžeme použiť túto triedu v nasledujúcom útržku kódu:


Ďalším súborom, ktorý uchováva potrebnú funkcionalitu, je functions.php. Tam máme niekoľko pomocných funkcií, ktoré nám umožňujú udržať zvyšok kódu upratanejší.

Funkcie.php

Funkcia send_email($from, $to, $predmet, $správa)(

// Pomocná funkcia na odosielanie e-mailov

$headers = "MIME verzia: 1.0" . "\r\n";
$headers .= "Typ obsahu: text/obyčajný; charset=utf-8" . "\r\n";
$headers .= "Od: ".$od . "\r\n";

vrátiť poštu ($komu, $predmet, $správa, $hlavičky);
}

funkcia get_page_url()(

// Zistite adresu URL súboru PHP

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

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

Return $url;
}

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

// Počet pokusov o prihlásenie za poslednú hodinu podľa tejto adresy IP

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

// Počet pokusov o prihlásenie za posledných 10 minút podľa tejto adresy IP

$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("Príliš veľa pokusov o prihlásenie!");
}
}

function rate_limit_tick($ip, $email)(

// Vytvorte nový záznam v tabuľke pokusov o prihlásenie

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

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

$login_attempt->save();
}

presmerovanie funkcie($url)(
header("Umiestnenie: $url");
východ;
}
Funkcie rate_limit a rate_limit_tick nám umožňujú obmedziť počet pokusov o autorizáciu na určité časové obdobie. Pokusy o autorizáciu sa zaznamenávajú v databáze reg_login_attempt. Tieto funkcie sa spúšťajú pri odoslaní prihlasovacieho formulára, ako môžete vidieť v nasledujúcom úryvku kódu.

Nižšie uvedený kód bol prevzatý z index.php a je zodpovedný za overenie prihlasovacieho formulára. Vracia odpoveď JSON, ktorá je riadená kódom jQuery, ktorý sme videli v aktívach/js/script.js.

index.php

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

// Výstup hlavičky JSON

Hlavička("Typ obsahu: aplikácia/json");

// Je e-mailová adresa platná?

If(!isset($_POST["e-mail"]) || !filter_var($_POST["e-mail"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Zadajte prosím platný email.");
}

// Toto vyvolá výnimku, ak je osoba vyššie
// limity povolených pokusov o prihlásenie (viac nájdete na functions.php):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Zaznamenajte tento pokus o prihlásenie
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["e-mail"]);

// Odoslať správu používateľovi

$správa = "";
$email = $_POST["e-mail"];
$subject = "Váš odkaz na prihlásenie";

If(!User::exists($email))(
$subject = "Ďakujeme za registráciu!";
$message = "Ďakujeme za registráciu na našej stránke!\n\n";
}

// Pokus o prihlásenie alebo registráciu osoby
$user = User::loginOrRegister($_POST["e-mail"]);

$message.= "Môžete sa prihlásiť z tejto adresy URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Platnosť odkazu vyprší automaticky po 10 minútach.";

$vysledok = send_email($fromEmail, $_POST["e-mail"], $predmet, $sprava);

If(!$result)(
throw new Exception("Pri odosielaní vášho e-mailu sa vyskytla chyba. Skúste to znova.");
}

Die(json_encode(pole(
"message" => "Ďakujeme! Poslali sme odkaz do vašej doručenej pošty. Skontrolujte si aj priečinok so spamom."
)));
}
}
catch(Výnimka $e)(

Die(json_encode(pole(
"error"=>1,
"message" => $e->getMessage()
)));
}
Po úspešnej autorizácii alebo registrácii odošle vyššie uvedený kód osobe e-mail s odkazom na autorizáciu. Token (token) bude dostupný ako premenná $_GET „tkn“ vďaka vygenerovanej adrese URL.

index.php

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

// Je toto platný prihlasovací token?
$user = User::findByToken($_GET["tkn"]);

//Áno! Prihláste používateľa a presmerujte ho na chránenú stránku.

$user->login();
redirect("chránené.php");
}

// Neplatný Token. Presmerujte späť na prihlasovací formulár.
redirect("index.php");
}
Spustenie $user->login() vytvorí potrebné premenné pre reláciu, čo používateľovi umožní zostať prihlásený pri ďalších prihláseniach.

Odhlásenie zo systému sa realizuje približne rovnakým spôsobom:

Index.php

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

$user = novy User();

If($user->loggedIn())(
$user->logout();
}

redirect("index.php");
}
Na konci kódu používateľa opäť presmerujeme na index.php, takže parameter ?logout=1 v URL je vylúčený.

Náš súbor index.php bude tiež potrebovať ochranu - nechceme, aby formulár videli už prihlásení užívatelia. Na tento účel používame metódu $user->loggedIn():

Index.php

$user = novy User();

if($user->prihlásený())(
redirect("chránené.php");
}
Nakoniec sa pozrime, ako môžete zabezpečiť stránku na svojom webe a sprístupniť ju až po prihlásení:

protected.php

// Na ochranu akejkoľvek stránky php na vašom webe zahrňte main.php
// a vytvorte nový objekt používateľa. Je to také jednoduché!

require_once "includes/main.php";

$user = novy User();

if(!$user->prihlásený())(
redirect("index.php");
}
Po tejto kontrole si môžete byť istí, že sa používateľ úspešne prihlásil. Budete mať tiež prístup k údajom uloženým v databáze ako vlastnosti objektu $user. Ak chcete zobraziť e-mail používateľa a jeho hodnotenie, použite nasledujúci kód:

echo "Váš email: ".$user->e-mail;
echo "Vaša hodnosť: ".$user->rank();
Rank() je tu metóda, pretože stĺpec hodnotenia v databáze zvyčajne obsahuje čísla (0 pre bežných používateľov a 1 pre správcov) a musíme to všetko previesť na názvy hodnotení, čo sa implementuje pomocou tejto metódy. Ak chcete previesť normálneho používateľa na správcu, jednoducho upravte záznam používateľa v phpmyadmin (alebo inom databázovom programe). Používateľ ako správca nebude vybavený žiadnymi špeciálnymi schopnosťami. Vy sami máte právo vybrať si, aké práva udelíte správcom.

Pripravený!

Na to je náš jednoduchý registračný systém pripravený! Môžete ho použiť na existujúcej PHP stránke, alebo si ho môžete upgradovať podľa vlastných potrieb.

Nie je to tak dávno, čo ma jeden z mojich návštevníkov požiadal, aby som napísal článok o ako zaregistrovať a autorizovať používateľov na stránke. V skutočnosti spĺňam jeho požiadavku a v tomto článku budem hovoriť o tom, ako sa to robí.

Spôsobov je viacero vytvorenie registrácie a autorizácie používateľa, ale v tomto článku rozoberiem moje obľúbené - cez mechanizmus relácií alebo cookies.

V prvom rade, ak chcete zaregistrujte sa na svojej webovej stránke, potom musíte pochopiť, kde budú údaje používateľa uložené. Môže byť uložený v obyčajnom textovom súbore, v XML súbor alebo v databáze. Prvé dve možnosti sú veľmi nebezpečné, preto vám ich neodporúčam používať. A tu je tretia možnosť - ukladanie informácií o užívateľoch do databázy- najobľúbenejší a odporúčam vám použiť tento spôsob ukladania informácií.

Miesto uloženia je rozhodnuté. Teraz poďme priamo na autorizačný algoritmus:

  1. Vytvorte registračný formulár na HTML.
  2. Získajte údaje z formulára v skripte obslužného programu.
  3. Skontrolujte prijaté údaje a ak sú nesprávne, presmerujte sa späť na registračný formulár.
  4. Ak sú údaje správne, zapíšte ich do databázy.

To je celý proces registrácia užívateľa na stránke. To znamená, že registrácia je uchovávanie informácií o používateľovi na stránke.

Ďalšou položkou je autorizáciu používateľa na stránke, ale skôr, ako k nemu pristúpim, poviem vám o jednom dôležitom bode v registračnom formulári - o hesle. Dôrazne vám odporúčam, aby ste heslá neukladali ako čistý text (napríklad „ 123456 "). Nezabudnite ich zašifrovať aspoň pomocou funkcie md5(). A uložte zašifrované heslo do databázy.

Teraz autorizácia. Prvá vec, ktorú musíte pochopiť, je, že autorizačné informácie musia byť niekde uložené. Najjednoduchšou možnosťou je ukladať informácie do relácie (alebo do cookie). A teraz algoritmus:

  1. Vytvorte autorizačný formulár používateľa na HTML kde bude musieť používateľ zadať svoje používateľské meno a heslo.
  2. V skripte obsluhy prijmite údaje od používateľa. Ak ste ma počúvali a ukladali si zašifrované heslá do databázy, tak najprv zašifrujte prijaté heslo. Ak databáza obsahuje otvorené heslá, nie je potrebné šifrovať.
  3. Skontrolujte správnosť zadaných údajov a ak sa prihlasovacie meno a heslo zhoduje s existujúcim používateľom v databáze, napíšte na cookie alebo informácie o relácii s prihlasovacím menom a zašifrovaným heslom (alebo otvoreným heslom, ak ste ho nezašifrovali).
  4. Ak je prihlasovacie meno a/alebo heslo zadané nesprávne, prejdite späť na autorizačný formulár.

Teraz máte potrebné informácie o autorizácia užívateľa, ktorý je uložený v cookie alebo na serveri (ak je relácia). V skutočnosti teraz musíte tieto informácie skontrolovať na každej stránke lokality a skontrolovať ich rovnakým spôsobom ako pri kontrole autorizačného formulára. To znamená, že čítajte z cookie(relácia) prihlasovacie meno a heslo a skontrolujte ho. Ak sú správne, zobrazte jednu stránku (pre registrovaných používateľov) a ak sú nesprávne, zobrazte ďalšiu stránku (pre hostí).

A posledný. Ako sa vyrába tlačidlo? Výkon"? Veľmi jednoduché. Stlačením tohto tlačidla sa cookie alebo reláciu. Používateľ je teda zo stránky automaticky odhlásený.

Ako vidíte, všetko je elementárne, ale pri implementácii tohto algoritmu budete mať určite veľa otázok. Napríklad, čo robiť pri registrácii používateľa, ktorého prihlasovacie meno je už v databáze. Implementácia rôznych vstupných kontrol, implementácia kontroly existencie e-mail a tak ďalej - to všetko je dosť komplikované, ak to robíte prvýkrát. Najviac šťavy som však vydal. Ak máte nejaké otázky počas implementácie, opýtajte sa buď na fóre alebo v komentároch.

Ahoj! Teraz sa pokúsime implementovať najjednoduchšiu registráciu na stránke pomocou PHP + MySQL. Na tento účel musí byť na vašom počítači nainštalovaný Apache. Ako funguje náš skript, je uvedené nižšie.

1. Začnime vytvorením tabuľky užívateľov v databáze. Bude obsahovať používateľské údaje (login a heslo). Poďme na phpmyadmin (ak si vytvoríte databázu na svojom PC http://localhost/phpmyadmin/). Vytvorte tabuľku používateľov, bude mať 3 polia.

Vytvorím ho v databáze mysql, môžete si ho vytvoriť v inej databáze. Ďalej nastavte hodnoty ako na obrázku:

2. Vyžaduje sa pripojenie k tejto tabuľke. Vytvorme súbor bd.php. Jej obsah:

$db = mysql_connect("váš server MySQL","prihlásenie na tento server","heslo na tento server");
mysql_select_db ("názov databázy na pripojenie", $db);
?>

V mojom prípade to vyzerá takto:

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

Ušetríme bd.php.
Dobre! V databáze máme tabuľku, spojenie s ňou. Teraz môžete začať vytvárať stránku, kde používatelia zanechajú svoje údaje.

3. Vytvorte súbor reg.php s obsahom (všetky komentáre vnútri):



registrácia


registrácia


















4. Vytvorte súbor, ktorý zadá údaje do databázy a uloží užívateľa. save_user.php(komentáre vo vnútri):



{
}
//ak je zadané prihlasovacie meno a heslo, spracujeme ich tak, aby značky a skripty nefungovali, nikdy neviete, čo môžu ľudia zadať


// odstránenie nadbytočných medzier
$login = trim($login);
$heslo = trim($heslo);
// pripojenie k databáze
// kontrola existencie používateľa s rovnakým prihlásením
$result = mysql_query("SELECT id FROM users WHERE login="$login"",$db);
if (!empty($myrow["id"])) (
exit("Prepáčte, zadané používateľské meno je už zaregistrované. Zadajte iné používateľské meno.");
}
// ak žiadne nie sú, uložte údaje
$vysledok2 = mysql_query ("INSERT INTO users (login,password) VALUES("$login","$password")");
// Skontrolujte, či sa nevyskytli chyby
if ($result2=="TRUE")
{
echo "Úspešne ste sa zaregistrovali! Teraz môžete vstúpiť na stránku. Hlavná stránka";
}
inak(
echo "Chyba! Nie ste prihlásený.";
}
?>

5. Teraz sa môžu registrovať naši užívatelia!Ďalej musíte urobiť „dvere“ na vstup na stránku pre už registrovaných používateľov. index.php(komentáre vo vnútri):

// celý postup funguje na reláciách. Práve v ňom sa ukladajú údaje používateľa, kým je na stránke. Je veľmi dôležité spustiť ich hneď na začiatku stránky!!!
session_start();
?>


Hlavná stránka


Hlavná stránka











Registrovať



// Skontrolujte, či sú premenné login a user id prázdne
if (prázdne ($_SESSION["login")] alebo prázdne ($_SESSION["id"]))
{
// Ak je prázdne, odkaz nezobrazíme
echo "Ste prihlásený ako hosť
Tento odkaz je dostupný len pre registrovaných užívateľov“;
}
inak
{

V súbore index.php zobrazíme odkaz, ktorý bude otvorený len pre registrovaných užívateľov. Toto je celý zmysel skriptu – obmedziť prístup k akýmkoľvek údajom.

6. Existuje súbor s overením zadaného loginu a hesla. testreg.php (komentáre vnútri):

session_start();// celý postup funguje na reláciách. Práve v ňom sa ukladajú údaje používateľa, kým je na stránke. Je veľmi dôležité spustiť ich hneď na začiatku stránky!!!
if (isset($_POST["login"])) ( $login = $_POST["login"]; if ($login == "") ( unset($login);) ) //zadajte prihlasovacie meno zadané používateľom užívateľa do premennej $login, ak je prázdna, tak premennú zničíme
if (isset($_POST["heslo"])) ( $password=$_POST["heslo"]; if ($password =="") ( unset($password);) )
//do premennej $password vložte heslo zadané používateľom, ak je prázdne, zničte premennú
if (empty($login) alebo empty($password)) //ak používateľ nezadal prihlasovacie meno alebo heslo, vypíšeme chybu a zastavíme skript
{
exit("Nezadali ste všetky informácie, vráťte sa a vyplňte všetky polia!");
}
//ak je zadané prihlasovacie meno a heslo, spracujeme ich tak, aby značky a skripty nefungovali, nikdy neviete, čo môžu ľudia zadať
$login = stripslashes($login);
$login = htmlspecialchars($login);
$heslo = stripslashes($password);
$heslo = htmlspecialchars($password);
// odstránenie nadbytočných medzier
$login = trim($login);
$heslo = trim($heslo);
// pripojenie k databáze
include("bd.php");// súbor bd.php by mal byť v rovnakom priečinku ako všetci ostatní, ak nie, stačí zmeniť cestu

$vysledok = mysql_query("SELECT * FROM users WHERE login="$login"",$db); //získanie všetkých údajov o užívateľovi so zadaným loginom z databázy
$myrow = mysql_fetch_array($vysledok);
if (empty($myrow["heslo"]))
{
//ak užívateľ so zadaným loginom neexistuje
}
inak(
//ak existuje, skontrolujte heslá
if ($myrow["password"]==$password) (
//ak sa heslá zhodujú, spustíme reláciu pre používateľa! Môžete mu zablahoželať, vstúpil!
$_SESSION["login"]=$myrow["login"];
$_SESSION["id"]=$myrow["id"];//tieto údaje sú veľmi často používané, takže ich "prenesie" prihlásený používateľ
echo "Úspešne ste sa prihlásili na stránku! Hlavná stránka";
}
inak(
//ak sa heslá nezhodujú

Exit("Prepáčte, zadané prihlasovacie meno alebo heslo je nesprávne.");
}
}
?>

No to je všetko! Možno je lekcia nudná, ale veľmi užitočná. Tu je zobrazená iba myšlienka registrácie, ďalej ju môžete vylepšiť: pridať ochranu, dizajn, dátové polia, nahrať avatary, odhlásiť sa z účtu (na to jednoducho zničte premenné z relácie pomocou funkcie odstaviť) atď. Veľa štastia!

Všetko skontrolované, funguje dobre!

Ak potrebujete sprístupniť jednu zo sekcií vašej stránky obmedzenému, ale neurčitému okruhu ľudí, najjednoduchší spôsob, ako to urobiť, je registrácia a autorizácia používateľov. Existuje mnoho spôsobov, ako autorizovať používateľov. Môžete použiť nástroje webového servera aj nástroje programovacieho jazyka. Budeme hovoriť o prípade, keď sa používajú relácie PHP.

Na začiatok si preberme všetky kroky, ktoré podnikneme ďalej. Čo skutočne potrebujeme? Potrebujeme skript, ktorý zaregistruje užívateľa, autorizuje užívateľa, po autorizácii ho niekam presmeruje. Budeme tiež musieť vytvoriť stránku, ktorá bude chránená pred prístupom neoprávnených používateľov. Pre registráciu a autorizáciu budeme musieť vytvoriť HTML formuláre. Informácie o registrovaných užívateľoch budeme uchovávať v databáze. To znamená, že stále potrebujeme skript pripojenia DBMS. Všetku prácu budeme vykonávať funkcie, ktoré si napíšeme sami. Tieto funkcie uložíme do samostatného súboru.

Potrebujeme teda nasledujúce súbory:

  • pripojenie k DBMS;
  • vlastné funkcie;
  • autorizácia;
  • registrácia;
  • zabezpečená stránka;
  • skript na vypnutie používateľa;
  • skript, ktorý kontroluje stav autorizácie používateľa;
  • štýly pre najjednoduchší dizajn našich stránok.

Toto všetko bude bezvýznamné, ak v databáze nemáte zodpovedajúcu tabuľku. Spustite svoj nástroj na správu DBMS (PhpMyAdmin alebo príkazový riadok, podľa toho, čo je pohodlnejšie) a vykonajte v ňom nasledujúci dotaz:

CREATE TABLE `users` (`id` int(11) NOT NULL AUTO_INCREMENT, `login` char(16) NOT NULL, `password` char(40) NOT NULL, `reg_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (` id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

Naše súbory skriptov pomenujem takto (všetky budú v rovnakom adresári):

  • databáza.php
  • funkcie.php
  • login.php
  • registrácia.php;
  • index.php;
  • logout.php;
  • checkAuth.php;
  • style.css

Účel každého z nich, som si istý, že chápete. Začnime skriptom pripojenia DBMS. Už ste ho videli. Stačí uložiť tento kód skriptu do súboru s názvom database.php . Vlastné funkcie deklarujeme v súbore functions.php. Ako to celé bude fungovať? Neautorizovaný používateľ sa pokúsi o prístup k chránenému dokumentu index.php , systém skontroluje, či je používateľ autorizovaný, ak používateľ nie je autorizovaný, je presmerovaný na autorizačnú stránku. Na autorizačnej stránke by mal užívateľ vidieť autorizačný formulár. Poďme na to.

Autorizácia užívateľa

Registrovať.



Teraz je potrebné, aby naša forma dostala nejakú formu. Zároveň zadefinujeme pravidlá pre ďalšie prvky. Pri pohľade dopredu poskytnem obsah šablóny štýlov v plnom znení.

/* súbor style.css */ .row ( margin-bottom:10px; width:220px; ) .row label ( display:block; font-weight:bold; ) .row input.text ( font-size:1.2em; padding:2px 5px; ) .to_reg ( font-size:0.9em; ) .instruction ( font-size:0.8em; color:#aaaaaa; margin-left:2px; cursor:default; ) .error ( color:red; margin-left:3px ;)

Ak je všetko vykonané správne, mali by ste mať v prehliadači nasledovné:

Samozrejme, zatiaľ nemáme ani jedného registrovaného užívateľa a pre prihlásenie je potrebné sa zaregistrovať. Urobme si registračný formulár.

registrácia používateľa

" />


Možno ste si všimli, že v kóde HTML sú prítomné premenné PHP. Sú obsahom atribútov textových polí formulára, obsahom chybových kontajnerov. Tieto premenné sme však neinicializovali. Poďme to urobiť.

registrácia používateľa

" />
Používateľské meno môže obsahovať iba latinské znaky, čísla, symboly "_", "-", ".". Dĺžka používateľského mena musí byť aspoň 4 znaky a nie dlhšia ako 16 znakov
V hesle môžete použiť iba latinské znaky, čísla, symboly "_", "!", "(", ")". Heslo musí mať aspoň 6 znakov a nie dlhšie ako 16 znakov
Zopakujte predtým zadané heslo


Atribút action značky formulára nemá zadaný žiadny parameter. V tomto prípade, keď sú údaje formulára odoslané, budú spracované v rovnakom skripte, z ktorého boli odoslané. Musíme teda napísať kód, ktorý spracováva údaje formulára. Ale poďme najprv diskutovať o algoritme na ich spracovanie.

Potrebujeme, aby polia prihlasovacieho mena a hesla neboli prázdne. Potom musíte skontrolovať, či prihlásenie spĺňa požiadavky. Heslo musí tiež spĺňať popísané požiadavky a znovu zadané heslo sa s ním musí zhodovať a navyše musí byť totožné. Ak niektorá z týchto podmienok nie je splnená, spracovanie údajov formulára by sa malo ukončiť, do poľa chybových hlásení by sa malo zapísať príslušné upozornenie a malo by sa zobraziť používateľovi. Pre pohodlie používateľa uložíme ním zadané prihlasovacie meno (ak ho zadal) a jeho hodnotu zapíšeme do poľa $fields.

Ak je všetko v poriadku, v okne prehliadača by ste podľa dokumentu registration.php mali vidieť niečo takéto:

Teraz povedzme, že používateľ klikol na tlačidlo registrácie a nevyplnil polia formulára. Podľa nášho algoritmu nemôžu byť prihlasovacie meno a heslo prázdne. Ak táto podmienka nie je splnená, registrácia nie je možná. Majme na pamäti, že spracovanie údajov formulára prebieha v aktuálnom scenári. Musíme teda zmeniť jeho kód pridaním príslušných kontrol. Poďme okamžite diskutovať o nasledujúcich kontrolách. Ak sú zadané prihlasovacie meno aj heslo, musíte skontrolovať, či sú v súlade so špecifikovanými požiadavkami. Pre kontrolu prihlasovacieho mena a hesla vytvoríme užívateľské funkcie v súbore functions.php.

/** * functions.php * Súbor s vlastnými funkciami */ // Pripojte súbor s parametrami pripojenia k DBMS require_once("database.php"); // Kontrola funkcie používateľského mena checkLogin($str) ( // Inicializácia premennej s možným chybovým hlásením $error = ""; // Ak neexistuje žiadny prihlasovací reťazec, vráti chybové hlásenie if(!$str) ( $error = " Nezadali ste používateľské meno"; return $error; ) /** * Skontrolujte používateľské meno pomocou regulárnych výrazov * Prihlásenie nesmie byť kratšie ako 4, nie dlhšie ako 16 znakov * Musí obsahovať latinské znaky, čísla, * môžu to byť znaky "_", "-", "." */ $pattern = "/^[-_.az\d](4,16)$/i"; $result = preg_match($pattern, $ str) ; // Ak kontrola zlyhá, vráti chybové hlásenie if(!$result) ( $error = "Neplatné znaky v používateľskom mene alebo je používateľské meno príliš krátke (dlhé)"; return $error; ) // Ak je všetko je v poriadku, vráti true return true; ) // Skontrolujte funkciu hesla používateľa checkPassword($str) ( // Inicializácia premennej s možnou chybovou správou $error = ""; // Ak chýba zadajte reťazec s prihlásením, vráti chybovú správu if(!$str) ( $error = "Nezadali ste heslo"; návrat $chyba; ) /** * Skontrolujte heslo používateľa pomocou regulárnych výrazov * Heslo nesmie byť kratšie ako 6, nie dlhšie ako 16 znakov * Musí obsahovať latinské znaky, čísla, * môže obsahovať znaky "_", "!", " (", ")" */ $vzor = "/^[_!)(.az\d](6,16)$/i"; $vysledok = preg_match($vzor, ​​$str); // Ak je kontrola zlyhalo, vráti chybovú správu if(!$result) ( $error = "Neplatné znaky v používateľskom hesle alebo heslo je príliš krátke (dlhé)"; return $error; ) // Ak je všetko v poriadku, vráti true return true; )

Teraz musíme upraviť súbor registration.php, aby používal funkcie, ktoré sme deklarovali. Do skriptu pridáme podmienku, ktorá skontroluje kliknutie na tlačidlo registrácie. V rámci tejto podmienky sa spustí kontrola prihlásenia a hesla. Ak ktorákoľvek z kontrol zlyhá, formulár znova vykreslíme a zobrazíme chybové hlásenie. Ak sa nevyskytnú chyby, používateľa zaregistrujeme, pričom registračný formulár sa už nezobrazuje, informujeme používateľa o úspešnej registrácii a pomocou funkcie header() ho presmerujeme na autorizačný formulár.

Úspešne ste sa zaregistrovali do systému. Teraz budete presmerovaní na prihlasovaciu stránku. Ak sa tak nestane, prejdite naň prostredníctvom priameho odkazu.

"; header("Refresh: 5; URL = login.php"); ) // V opačnom prípade informujte používateľa o chybe else ( $errors["full_error"] = $reg; ) ) ) ?> registrácia používateľa
" />
Používateľské meno môže obsahovať iba latinské znaky, čísla, symboly "_", "-", ".". Dĺžka používateľského mena musí byť aspoň 4 znaky a nie dlhšia ako 16 znakov
V hesle môžete použiť iba latinské znaky, čísla, symboly "_", "!", "(", ")". Heslo musí mať aspoň 6 znakov a nie dlhšie ako 16 znakov
Zopakujte predtým zadané heslo


Mali ste si všimnúť ešte jednu novú funkciu v skripte - registration() . Zatiaľ sme to neoznámili. Poďme to urobiť.

// Funkcia registrácie užívateľa registrácia ($login, $password) ( // Inicializácia premennej s možnou chybovou správou $error = ""; // Ak neexistuje žiadny prihlasovací reťazec, vráti chybovú správu if(!$login) ( $ error = "Prihlásenie nie je zadané"; return $error; ) elseif(!$password) ( $error = "Heslo nie je zadané"; return $error; ) // Skontrolujte, či je používateľ už zaregistrovaný // Pripojte sa k DBMS connect() ; // Napíšte reťazec dotazu $sql = "SELECT `id` FROM `users` WHERE `login`="" . $login . """; // Vytvorenie databázového dotazu $query = mysql_query($ sql) or die( ""); // Pozrite sa na počet používateľov s týmto prihlásením, ak existuje aspoň jeden, // vráti chybovú správu if(mysql_num_rows($query) > 0) ( $error = "The používateľ so zadaným prihlasovacím menom je už zaregistrovaný"; return $ error; ) // Ak takýto používateľ neexistuje, zaregistrujte ho // Napíšte reťazec dotazu $sql = "INSERT INTO `users` (`id`,`login`, `heslo`) HODNOTY (NULL, "" . $login ." ","". $heslo. "")"; // Urobte dotaz do databázy $query = mysql_query($sql) or die("

Nie je možné pridať používateľa: " . mysql_error() .". Vyskytla sa chyba na riadku " . __LINE__."

"); // Nezabudnite sa odpojiť od DBMS mysql_close(); // Vráti hodnotu true, čo znamená úspešnú registráciu používateľa, vráti hodnotu true; )

Ak je všetko v poriadku, váš používateľ bude zaregistrovaný. Formulár môžete otestovať. Skúste zaregistrovať používateľov s rovnakými prihlasovacími údajmi. Po úspešnej registrácii bude používateľ presmerovaný na autorizačný formulár. Predtým sme jednoducho vytvorili označenie na zobrazenie tohto formulára. Keďže v atribúte akcie nie je zadaný žiadny parameter, údaje odoslané formulárom sa spracujú v rovnakom skripte. Musíme teda napísať kód na spracovanie a pridať ho do dokumentu login.php.

Autorizácia užívateľa

;">

Ak nie ste zaregistrovaný v systéme, zaregistrujte sa.



Možno ste si všimli, že teraz máme v autorizačnom skripte ďalšiu neznámu funkciu — autorizáciu() . Táto funkcia by mala používateľa autorizovať tak, že najskôr skontroluje, či je v databáze registrovaný používateľ s rovnakým prihlasovacím menom a heslom. Ak sa takýto používateľ nenájde, autorizácia sa preruší a na obrazovke sa zobrazí správa o zlyhaní. Po úspešnom overení funkcia authorization() spustí reláciu a zapíše do nej prihlasovacie meno a heslo používateľa, informuje skript o úspešnosti autorizácie a skript presmeruje používateľa na zabezpečenú stránku zdroja.

/** * Funkcia autorizácie používateľa. * Autorizácia používateľov bude vykonaná * pomocou relácií PHP. */ autorizácia funkcie ($login, $password) ( // Inicializácia premennej s možnou chybovou správou $error = ""; // Ak neexistuje žiadny prihlasovací reťazec, vráti chybovú správu if(!$login) ( $chyba = " Prihlásenie nie je zadané"; return $error; ) elseif(!$password) ( $error = "Heslo nie je zadané"; return $error; ) // Skontrolujte, či je používateľ už zaregistrovaný // Pripojte sa k DBMS connect( ); // Musíme skontrolovať, či medzi registrovanými existuje taký používateľ // Zostavte reťazec dopytu $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" A `password`="".$password ."""; // Spustite dotaz $query = mysql_query($sql) or die("

Nie je možné vykonať dotaz: " . mysql_error() .". Vyskytla sa chyba na riadku " . __LINE__."

"); // Ak neexistuje žiadny používateľ s takýmito údajmi, vráti chybové hlásenie if(mysql_num_rows($query) == 0) ( $error = "Používateľ so zadanými údajmi nie je zaregistrovaný"; return $error; ) // Ak používateľ existuje, spustite reláciu session_start(); // A zapíšte do nej používateľské meno a heslo // Na tento účel použijeme superglobálne pole $_SESSION $_SESSION["login"] = $login; $ _SESSION["password"] = $password; // Nezabudnite zatvoriť databázové pripojenie mysql_close(); // Vrátiť hodnotu true, ak chcete nahlásiť úspešnú autorizáciu používateľa, vrátiť hodnotu true; )

Keď používateľ vstúpi na zabezpečenú stránku, mali by ste skontrolovať správnosť jeho autorizačných údajov. Na to potrebujeme ešte jednu užívateľom definovanú funkciu. Nazvime to checkAuth() . Jeho úlohou bude overiť autorizačné údaje používateľa s údajmi uloženými v našej databáze. Ak sa údaje nezhodujú, používateľ bude presmerovaný na autorizačnú stránku.

Funkcia checkAuth($login, $password) ( // Ak neexistuje prihlasovacie meno alebo heslo, vráťte hodnotu false if(!$login || !$password) vráťte hodnotu false; // Skontrolujte, či je takýto používateľ registrovaný // Pripojte sa k DBMS connect(); // Vytvorenie reťazca dopytu $sql = "SELECT `id` FROM `users` WHERE `login`="".$login."" AND `password`="".$password."""; // Spustite dotaz $ query = mysql_query($sql) or die("

Nie je možné vykonať dotaz: " . mysql_error() .". Vyskytla sa chyba na riadku " . __LINE__."

"); // Ak neexistuje žiadny používateľ s takýmito údajmi, vráťte hodnotu false; if(mysql_num_rows($query) == 0) ( return false; ) // Nezabudnite zatvoriť pripojenie k databáze mysql_close(); // V opačnom prípade vráti true, vráti true; )

Teraz, keď sa používateľ dostal na zabezpečenú stránku, musíme zavolať funkciu overenia autorizačných údajov. Skript volania a kontroly umiestnime do samostatného súboru checkAuth.php a pripojíme ho k tým stránkam, ktoré budú zatvorené pre verejný prístup.

/** * Skript na kontrolu autorizácie používateľa */ // Spustíme reláciu, z ktorej vytiahneme prihlasovacie meno a heslo // oprávnených používateľov session_start(); // Zahrnie súbor s vlastnými funkciami require_once("functions.php"); /** * Aby sme zistili, či je používateľ prihlásený, musíme * skontrolovať, či v databáze existujú záznamy pre jeho používateľské meno * a heslo. K tomu použijeme vlastnú funkciu * na kontrolu správnosti údajov oprávneného užívateľa. * Ak táto funkcia vráti hodnotu false, potom neexistuje žiadna autorizácia. * Ak neexistuje žiadna autorizácia, používateľa jednoducho presmerujeme * na stránku autorizácie. */ // Ak relácia obsahuje prihlasovacie údaje aj heslo, // skontrolujte ich if(isset($_SESSION["login"]) && $_SESSION["login"] && isset($_SESSION["heslo" ]) && $_SESSION["password"]) ( // Ak overenie existujúcich údajov zlyhá if(!checkAuth($_SESSION["login"], $_SESSION["password"])) ( // Presmerujte používateľa na hlavičku prihlasovacej stránky ("location: login.php"); // Ukončenie vykonávania ukončenia skriptu; ) ) // Ak neexistujú žiadne údaje o prihlásení alebo hesle používateľa, // sa domnievame, že neexistuje žiadna autorizácia, presmerujte user // na autorizačnú stránku else ( header("location: login.php"); // Zastavenie ukončenia vykonávania skriptu; )

Teraz poďme vytvoriť kód pre našu zabezpečenú stránku. Bude to celkom jednoduché.

Autorizácia a registrácia používateľov

Úspešná autorizácia.

Dostali ste sa na zabezpečenú stránku. Môžete sa odhlásiť.



Ako vidíte, v chránenom dokumente obsahujeme iba jeden súbor – checkAuth.php. Všetky ostatné súbory sú zahrnuté v iných scenároch. Náš kód preto nevyzerá objemne. Zorganizovali sme registráciu a autorizáciu používateľov. Teraz musíte používateľom povoliť odhlásenie. Za týmto účelom vytvoríme skript v súbore logout.php.

/** * Skript na odhlásenie používateľa. Keďže používatelia sú * autorizovaní prostredníctvom relácií, ich používateľské meno a heslo sú * uložené v superglobálnom poli $_SESSION. Ak sa chcete odhlásiť * zo systému, jednoducho zničte hodnoty * polí $_SESSION["login"] a $_SESSION["password"], * potom používateľa presmerujeme na prihlasovaciu stránku */ // Be nezabudnite spustiť reláciu session_start(); unset($_SESSION["prihlásenie"]); unset($_SESSION["heslo"]); header("umiestnenie: login.php");

Skript na registráciu, autorizáciu a overenie používateľov je pripravený. Môžete ho použiť pre seba, doplniť, upraviť podľa svojich potrieb. Ak máte otázky, môžete sa ich opýtať v komentároch. Všetky tu diskutované súbory si môžete stiahnuť zabalené do jedného archívu.

P.S. Som si vedomý toho, že je lepšie písať objektovo orientovaný kód, viem, že sa neoplatí prenášať a uchovávať heslo v čistom texte, že informácie vložené do databázy treba najskôr skontrolovať. Viem. O tomto tu nebudem hovoriť.