Domov Iné Presná registrácia používateľa indexu php. Jednoduchý systém registrácie používateľov

Presná registrácia používateľa indexu php. Jednoduchý systém registrácie používateľov

Proces vytvárania registračného systému je pomerne veľa práce. Musíte napísať kód, ktorý dvakrát skontroluje platnosť e-mailových adries, odošle potvrdzovacie e-maily, ponúkne možnosť obnoviť heslá, uloží heslá na bezpečné miesto, overí vstupné formuláre a mnoho ďalšieho. 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ý registračný systém, ktorý nebude vyžadovať žiadne heslá! Výsledkom bude systém, ktorý bude možné jednoducho upraviť alebo integrovať do existujúcej PHP webovej stránky. Ak máte záujem, pokračujte v čítaní.

PHP

Teraz sme pripravení začať s PHP kódom. Hlavnú funkcionalitu registračného systému zabezpečuje trieda Používateľ, ktorú si môžete pozrieť nižšie. Trieda používa (), čo je minimalistická databázová knižnica. Trieda User je zodpovedná za prístup k databázam, generovanie prihlasovacích tokenov a ich validáciu. Predstavuje nám jednoduché rozhranie, ktoré možno ľahko začleniť do registračného systému vašich webových stránok 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ť
* @return User
*/

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.
* @return User
*/

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

Return User::create($email);
}

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

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ľ v databáze existuje, 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)
->pocet();

Return $vysledok == 1;
}

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

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ásiť 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("posledne_prihlasenie", "TERAZ()");
$this->orm->save();
}

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

Odhlásenie z 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 hodnosť())(
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. Používame MySQL na nastavenie stĺpca token_validity na 10 minút. Pri validácii tokenu povieme enginu, že potrebujeme token, pole token_validity ešte nevypršalo. Takto obmedzíme čas, počas ktorého bude token platný.

Všimnite si, že na prístup k vlastnostiam objektu používateľa používame magickú metódu __get() na konci dokumentu. To nám umožňuje pristupovať k údajom, ktoré sú uložené 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. Máme tu niekoľko pomocných funkcií, ktoré nám umožňujú udržať zvyšok kódu prehľadnejší.

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 IP adresy

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

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

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

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)(

// Vytvorenie nového záznamu 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 spustia pri overení 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 danej osobe e-mail s odkazom na autorizáciu. Token je sprístupnený ako $_GET premenná "tkn" vďaka vygenerovanej 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é relácie, č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 adrese odpadá.

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 na to, ako môžete chrániť svoju webovú stránku a sprístupniť ju až po autorizácii:

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, ktoré sú uložené 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->email;
echo "Vaša hodnosť: ".$user->rank();
Rank() je 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 ich všetky previesť na názvy hodnotení, čo sa implementuje pomocou tejto metódy. Ak chcete previesť štandardného používateľa na správcu, jednoducho upravte záznam používateľa v phpmyadmin (alebo inom databázovom programe). Používateľovi ako správcovi nebudú udelené žiadne špeciálne schopnosti. Vy sami máte právo vybrať si, aké práva udelíte správcom.

Pripravený!

Vďaka tomu je náš jednoduchý registračný systém pripravený! Môžete ho použiť na existujúcej PHP stránke alebo ju zmodernizovať podľa vlastných požiadaviek.

Dobrý deň, priatelia v tomto návode sa naučíme registráciu a prihlásenie používateľov pomocou uloženej procedúry PHP.
Štruktúra súboru pre tento tutoriál
config.php
index.php
check_availability.php
login.php
vitajte.php
odhlásiť.php
Štruktúra tabuľky SQL tblregistration

CREATE TABLE `tblregistration` (`id` int(11) NOT NULL, `FullName` varchar(200) NOT NULL, `EmailId` varchar(200) NOT NULL, `Password` varchar(255) NOT NULL, `RegDate` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=latin1;

config.php

Vytvorte konfiguračný súbor db pomocou rozšírenia mysqli. Poskytnite poverenia podľa vašej konfigurácie

index.php

Vytvorte html formulár na registráciu používateľa.

Registrácia Celé meno E-mail Heslo

Už zaregistrované. prihláste sa tu

Jquery / Ajax pre dostupnosť e-mailu používateľa

check_availability.php

Na tejto stránke skontrolujeme dostupnosť e-mailu používateľa. Vytvorte procedúru obchodu s dostupnosťou kontroly názvu
Kód postupu uloženia:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `checkavailbilty`(IN `email` VARCHAR(255)) NO SQL SELECT EmailId FROM tblregistration WHERE EmailId=email$ DELIMITER ;

Teraz vytvorte procedúru uloženia pre registráciu používateľa.
Uložiť postup registrácie používateľa

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `registration`(IN `fname` VARCHAR(200), IN `emailid` VARCHAR(200), IN `password` VARCHAR(255)) NO SQL insert into tblregistration( Celé meno,EmailId,Heslo) VALUES(meno,email,heslo)$ DELIMITER ;

Po vytvorení procedúry store vykonajte procedúru store.

Tu je úplný kód, ktorý sme napísali na registráciu (index.php):

Registrácia pomocou funkcie Store Procedure checkAvailability() ( $("#loaderIcon").show(); jQuery.ajax(( url: "check_availability.php", data:"emailid="+$("#email").val (), zadajte: "POST", success:function(data)( $("#user-availability-status").html(data); $("#loaderIcon").hide(); ), error:function ()() )); ) Registrácia Celé meno E-mail Heslo

Už zaregistrované. prihláste sa tu

login.php

Vytvorte prihlasovací formulár prihlásenie používateľa.

Prihlásiť sa

Neregistrovaný? Vytvoriť účet

Teraz vytvorte ukladaciu procedúru pre prihlásenie pomocou prihlasovacieho mena.
Postup prihlásenia do obchodu:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `login`(IN `useremail` VARCHAR(255), IN `password` VARCHAR(255)) NO SQL SELECT EmailId,Password from tblregistration where EmailId=useremail and Password= heslo$ DELIMITER ;

Teraz vykonajte postup ukladania prihlásení

Novinka na stránke

>

Najpopulárnejší