Dom Inny Dokładny indeks rejestracji użytkownika php. Prosty system rejestracji użytkowników

Dokładny indeks rejestracji użytkownika php. Prosty system rejestracji użytkowników

Proces tworzenia systemu rejestracji jest dość pracochłonny. Musisz napisać kod, który dwukrotnie sprawdza ważność adresów e-mail, wysyła e-maile z potwierdzeniem, oferuje możliwość odzyskiwania haseł, przechowuje hasła w bezpiecznym miejscu, sprawdza poprawność formularzy wejściowych i wiele więcej. Nawet jeśli to wszystko zrobisz, użytkownicy będą niechętni do rejestracji, ponieważ nawet najmniejsza rejestracja wymaga ich aktywności.

W dzisiejszym samouczku będziemy opracowywać prosty system rejestracji, który nie będzie wymagał żadnych haseł! W rezultacie powstanie system, który można łatwo zmodyfikować lub zintegrować z istniejącą stroną internetową PHP. Jeśli jesteś zainteresowany, czytaj dalej.

PHP

Teraz jesteśmy gotowi, aby rozpocząć pracę z kodem PHP. Główną funkcjonalność systemu rejestracji zapewnia klasa User, którą możesz zobaczyć poniżej. Klasa używa (), która jest minimalistyczną biblioteką bazy danych. Klasa User odpowiada za dostęp do baz danych, generowanie tokenów logowania i ich walidację. Przedstawia nam prosty interfejs, który można łatwo włączyć do systemu rejestracji stron internetowych opartych na PHP.

Użytkownik.klasa.php

// Prywatna instancja ORM
prywatny $orm;

/**
* Znajdź użytkownika za pomocą ciągu tokena. Pod uwagę brane są tylko ważne tokeny
* namysł. Token jest ważny przez 10 minut od momentu wygenerowania.
* @param string $token Token do wyszukania
* @return Użytkownik
*/

Publiczna funkcja statyczna findByToken($token)(

// znajdź go w bazie danych i upewnij się, że znacznik czasu jest poprawny


->where("token", $token)
->where_raw("ważność_tokenu > TERAZ()")
->znajdź_jeden();

Jeśli(!$wynik)(
zwróć fałsz;
}

Zwróć nowego użytkownika ($result);
}

/**
* Zaloguj się lub zarejestruj użytkownika.
* @return Użytkownik
*/

Publiczna funkcja statyczna loginOrRegister($email)(

// Jeśli taki użytkownik już istnieje, zwróć go

If(Użytkownik::istnieje($e-mail))(
zwróć nowego użytkownika ($email);
}

// W przeciwnym razie utwórz go i zwróć

Zwróć użytkownika::create($email);
}

/**
* Utwórz nowego użytkownika i zapisz go w bazie danych
* @param string $email Adres e-mail użytkownika
* @return Użytkownik
*/

Prywatna funkcja statyczna create($email)(

// Zapisz nowego użytkownika do bazy danych i zwróć go

$result = ORM::for_table("reg_users")->create();
$wynik->e-mail = $e-mail;
$wynik->zapisz();

Zwróć nowego użytkownika ($result);
}

/**
* Sprawdź, czy taki użytkownik istnieje w bazie danych i zwróć wartość logiczną.
* @param string $email Adres e-mail użytkownika
* Wartość logiczna @return
*/

Istnieje publiczna funkcja statyczna($email)(

// Czy użytkownik istnieje w bazie danych?
$wynik = ORM::for_table("reg_users")
->gdzie("e-mail", $e-mail)
->liczba();

Zwróć wynik $ == 1;
}

/**
* Utwórz nowy obiekt użytkownika
* @param $param Instancja ORM, identyfikator, adres e-mail lub wartość null
* @return Użytkownik
*/

Funkcja publiczna __construct($param = null)(

If($param instancja ORM)(

// Przekazano instancję ORM
$this->orm = $param;
}
else if(is_string($param))(

// E-mail został przekazany
$to->
->gdzie("e-mail", $param)
->znajdź_jeden();
}
w przeciwnym razie(

If(is_numeric($param))(
// Jako parametr przekazano identyfikator użytkownika
$id = $parametr;
}
else if(isset($_SESSION["loginid"]))(

// Nie przekazano żadnego identyfikatora użytkownika. Sprawdź sesję
$id = $_SESSION["loginid"];
}

$this->orm = ORM::for_table("reg_users")
->gdzie("id", $id)
->znajdź_jeden();
}

/**
* Generuje nowy token logowania SHA1, zapisuje go do bazy danych i zwraca.
* @ciąg zwrotny
*/

Funkcja publiczna generateToken())(
// wygeneruj token dla zalogowanego użytkownika. Zapisz go do bazy danych.

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

// Zapisz token do bazy danych,
// i zaznacz go jako ważny tylko przez następne 10 minut

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

Zwróć $token;
}

/**
*Zaloguj się do tego użytkownika
* @powrót nieważny
*/

Funkcja publiczna login()

// Oznacz użytkownika jako zalogowanego
$_SESSION["loginid"] = $this->orm->id;

// Zaktualizuj pole db last_login
$this->orm->set_expr("last_login", "TERAZ()");
$this->orm->save();
}

/**
* Zniszcz sesję i wyloguj użytkownika.
* @powrót nieważny
*/

Wylogowanie z funkcji publicznej()
$_SESSION = tablica();
rozbrojony($_SESSION);
}

/**
* Sprawdź, czy użytkownik jest zalogowany.
* Wartość logiczna @return
*/

Funkcja publiczna zalogowana())(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Sprawdź, czy użytkownik jest administratorem
* Wartość logiczna @return
*/

Funkcja publiczna isAdmin())(
return $this->rank() == "administrator";
}

/**
* Znajdź typ użytkownika. Może to być administrator lub zwykły.
* @ciąg zwrotny
*/

Ranga funkcji publicznej())(
if($this->orm->rank == 1)(
zwróć „administrator”;
}

Powrót „zwykły”;
}

/**
* Magiczna metoda dostępu do elementów prywatnych
* Instancja $orm jako właściwości obiektu użytkownika
* @param string $key Nazwa wywoływanej właściwości
* @powrót mieszany
*/

Funkcja publiczna __get($key)(
if(isset($this->orm->$key))(
zwróć $this->orm->$key;
}

Zwróć wartość null;
}
}
Tokeny są generowane za pomocą algorytmu i przechowywane w bazie danych. Używamy MySQL, aby ustawić kolumnę token_validity na 10 minut. Podczas walidacji tokena mówimy silnikowi, że potrzebujemy tokena, pole token_validity jeszcze nie wygasło. W ten sposób ograniczamy czas, w którym token będzie ważny.

Zauważ, że na końcu dokumentu używamy magicznej metody __get(), aby uzyskać dostęp do właściwości obiektu użytkownika. Dzięki temu mamy dostęp do danych przechowywanych w bazie danych jako właściwości: $user->email, $user->token. Jako przykład przyjrzyjmy się, jak możemy wykorzystać tę klasę w następującym fragmencie kodu:


Kolejnym plikiem przechowującym niezbędną funkcjonalność jestfunction.php. Mamy tam kilka funkcji pomocniczych, które pozwalają nam zachować porządek w pozostałej części kodu.

Funkcje.php

Funkcja send_email($od, $do, $temat, $wiadomość)(

// Funkcja pomocnicza do wysyłania wiadomości e-mail

$headers = "Wersja MIME: 1.0" . „\r\n”;
$headers .= "Typ zawartości: tekst/zwykły; charset=utf-8" . „\r\n”;
$headers .= "Od: ".$od . „\r\n”;

Poczta zwrotna ($do, $temat, $wiadomość, $nagłówki);
}

funkcja get_page_url())(

// Znajdź adres URL pliku PHP

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

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

Zwróć $url;
}

funkcjarate_limit($ip, $limit_godzina = 20, $limit_10_min = 10)(

// Liczba prób logowania w ciągu ostatniej godziny przy użyciu tego adresu IP

$count_hour = ORM::for_table("reg_login_attempt")
->
->where_raw("ts > PODCZAS(TERAZ(),"1:00")")
->liczba();

// Liczba prób logowania w ciągu ostatnich 10 minut przy użyciu tego adresu IP

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

If($count_hour > $limit_hour || $count_10_min > $limit_10_min)(
zgłosić nowy wyjątek("Zbyt wiele prób logowania!");
}
}

funkcjarate_limit_tick($ip, $e-mail)(

// Utwórz nowy rekord w tabeli prób logowania

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

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

$login_attempt->zapisz();
}

przekierowanie funkcji ($url)(
header("Lokalizacja: $url");
Wyjście;
}
Funkcjerate_limit irate_limit_tick pozwalają nam ograniczyć ilość prób autoryzacji na określony okres czasu. Próby autoryzacji rejestrowane są w bazie reg_login_attempt. Funkcje te są uruchamiane po zweryfikowaniu formularza logowania, jak widać w poniższym fragmencie kodu.

Poniższy kod został pobrany z pliku Index.php i odpowiada za zatwierdzenie formularza logowania. Zwraca odpowiedź JSON sterowaną przez kod jQuery, który widzieliśmy w pliku Assets/js/script.js.

indeks.php

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

// Wyprowadź nagłówek JSON

Header("Typ zawartości: aplikacja/json");

// Czy adres e-mail jest ważny?

If(!isset($_POST["e-mail"]) || !filter_var($_POST["e-mail"], FILTER_VALIDATE_EMAIL))(
zgłosić nowy wyjątek("Wprowadź poprawny adres e-mail.");
}

// Spowoduje to zgłoszenie wyjątku, jeśli osoba jest powyżej
// dozwolone limity prób logowania (więcej informacji znajdziesz w plikufunctions.php):
limit_liczby($_SERWER["REMOTE_ADDR"]);

// Nagraj tę próbę logowania
stawka_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["e-mail"]);

// Wyślij wiadomość do użytkownika

$wiadomość = "";
$e-mail = $_POST["e-mail"];
$temat = "Twój link do logowania";

If(!Użytkownik::istnieje($e-mail))(
$subject = "Dziękujemy za rejestrację!";
$message = "Dziękujemy za rejestrację na naszej stronie!\n\n";
}

// Próba zalogowania lub zarejestrowania osoby
$użytkownik = Użytkownik::loginOrRegister($_POST["e-mail"]);

$message.= "Możesz zalogować się z tego adresu URL:\n";
$message.= get_page_url().”?tkn=".$user->generateToken()."\n\n";

$message.= "Link wygaśnie automatycznie po 10 minutach.";

$result = send_email($fromEmail, $_POST["email"], $temat, $wiadomość);

Jeśli(!$wynik)(
rzucaj nowy wyjątek("Wystąpił błąd podczas wysyłania Twojego e-maila. Spróbuj ponownie.");
}

Die(json_encode(tablica(
"message" => "Dziękujemy! Wysłaliśmy link na Twoją skrzynkę odbiorczą. Sprawdź także folder ze spamem.”
)));
}
}
catch(Wyjątek $e)(

Die(json_encode(tablica(
"błąd"=>1,
"wiadomość" => $e->getMessage()
)));
}
Po pomyślnej autoryzacji lub rejestracji powyższy kod wysyła wiadomość e-mail do osoby z linkiem do autoryzacji. Token udostępniany jest jako zmienna $_GET „tkn” ze względu na wygenerowany adres URL.

indeks.php

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

// Czy to prawidłowy token logowania?
$użytkownik = Użytkownik::findByToken($_GET["tkn"]);

//Tak! Zaloguj się i przekieruj na chronioną stronę.

$użytkownik->login();
przekierowanie("chroniony.php");
}

// Nieprawidłowy Token. Przekieruj z powrotem do formularza logowania.
przekierowanie("indeks.php");
}
Uruchomienie $user->login() utworzy niezbędne zmienne sesyjne, dzięki czemu użytkownik pozostanie zalogowany przy kolejnych logowaniach.

Wylogowanie z systemu odbywa się mniej więcej w ten sam sposób:

Index.php

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

$użytkownik = nowy użytkownik();

If($użytkownik->zalogowany())(
$użytkownik->wyloguj();
}

Przekieruj("indeks.php");
}
Na końcu kodu ponownie przekierowujemy użytkownika do pliku Index.php, dzięki czemu parametr ?logout=1 w adresie URL jest eliminowany.

Nasz plik Index.php również będzie wymagał ochrony - nie chcemy, aby już zalogowani użytkownicy widzieli formularz. W tym celu używamy metody $user->loggedIn():

Index.php

$użytkownik = nowy użytkownik();

if($użytkownik->zalogowany())(
przekierowanie("chroniony.php");
}
Na koniec przyjrzyjmy się, jak możesz chronić stronę swojej witryny i udostępnić ją dopiero po autoryzacji:

chroniony.php

// Aby chronić dowolną stronę php w swojej witrynie, dołącz plik main.php
// i utwórz nowy obiekt użytkownika. To takie proste!

require_once "zawiera/main.php";

$użytkownik = nowy użytkownik();

if(!$użytkownik->zalogowany())(
przekierowanie("indeks.php");
}
Po tym sprawdzeniu możesz mieć pewność, że użytkownik pomyślnie się zalogował. Będziesz mieć także dostęp do danych przechowywanych w bazie danych jako właściwości obiektu $user. Aby wyświetlić adres e-mail użytkownika i jego rangę, użyj następującego kodu:

Echo "Twój e-mail: ".$user->email;
echo "Twoja ranga: ".$user->rank();
Tutaj rank() jest metodą, ponieważ kolumna rang w bazie danych zwykle zawiera liczby (0 dla zwykłych użytkowników i 1 dla administratorów) i musimy je wszystkie przekonwertować na nazwy rang, co jest implementowane przy użyciu tej metody. Aby przekonwertować zwykłego użytkownika na administratora, po prostu edytuj wpis użytkownika w phpmyadmin (lub dowolnym innym programie bazodanowym). Jako administrator użytkownik nie otrzyma żadnych specjalnych możliwości. Sam masz prawo wybrać, jakie uprawnienia przyznasz administratorom.

Gotowy!

Dzięki temu nasz prosty system rejestracji jest gotowy! Możesz go używać na istniejącej witrynie PHP lub zmodernizować ją, aby dostosować ją do własnych wymagań.

Witajcie, przyjaciele, w tym samouczku nauczymy się rejestracji użytkownika i logowania przy użyciu procedury zapisanej w PHP.
Struktura plików dla tego samouczka
config.php
indeks.php
check_availability.php
login.php
witamy.php
wyloguj się.php
Struktura rejestracji tabeli sql

UTWÓRZ TABELĘ `tblregistration` (`id` int(11) NIE NULL, `FullName` varchar(200) NIE NULL, `EmailId` varchar(200) NIE NULL, `Password` varchar(255) NIE NULL, `RegDate` znacznik czasu NOT NULL DEFAULT CURRENT_TIMESTAMP) ENGINE=InnoDB DEFAULT CHARSET=latin1;

config.php

Utwórz plik konfiguracyjny db przy użyciu rozszerzenia mysqli. Podaj dane uwierzytelniające zgodnie ze swoją konfiguracją

indeks.php

Utwórz formularz HTML do rejestracji użytkownika.

Zarejestruj się Imię i nazwisko E-mail Hasło

Już zarejestrowany. Zaloguj się tutaj

Jquery/Ajax dla dostępności poczty elektronicznej użytkowników

check_availability.php

Na tej stronie sprawdzimy dostępność adresu e-mail użytkownika. Utwórz procedurę sklepu z możliwością sprawdzenia dostępności nazwy
Kod procedury przechowywania:

DELIMITER $ UTWÓRZ DEFINER=`root`@`localhost` PROCEDURA `checkavailbilty`(W `email` VARCHAR(255)) NIE SQL WYBIERZ EmailId Z tblrejestracji WHERE EmailId=email$ DELIMITER ;

Utwórz teraz procedurę sklepu służącą do rejestracji użytkownika.
Procedura przechowywania rejestracji użytkownika

DELIMITER $ UTWÓRZ DEFINER=`root`@`localhost` PROCEDURA `rejestracja`(IN `fname` VARCHAR(200), IN `emailid` VARCHAR(200), IN `hasło` VARCHAR(255)) BRAK wstawki SQL do tblregistration( Imię i nazwisko,Identyfikator e-maila,Hasło) WARTOŚCI(nazwa,id e-mail,hasło)$ DELIMITER ;

Po utworzeniu procedury sklepu wykonaj procedurę sklepu.

Oto pełny kod, który napisaliśmy w celu rejestracji (index.php):

Rejestracja przy użyciu funkcji procedury sklepu checkAvailability() ( $("#loaderIcon").show(); jQuery.ajax(( url: "check_availability.php", data:"emailid="+$("#email").val (), wpisz: „POST”, sukces:funkcja(dane)( $("#user-availability-status").html(data); $("#loaderIcon").hide(); ), błąd:funkcja ()() )); ) Zarejestruj się Imię i nazwisko E-mail Hasło

Już zarejestrowany. Zaloguj się tutaj

login.php

Utwórz login użytkownika formularza logowania.

Zaloguj sie

Nie zarejestrowany? Utwórz konto

Teraz utwórz procedurę sklepu do logowania przy użyciu nazwy logowania.
Procedura logowania do sklepu:

DELIMITER $ UTWÓRZ DEFINER=`root`@`localhost` PROCEDURA `login`(IN `useremail` VARCHAR(255), IN `hasło` VARCHAR(255)) NIE SQL WYBIERZ EmailId,Hasło z rejestracji tbl gdzie EmailId=useremail i Hasło= hasło$ DELIMITER;

Teraz wykonaj procedurę przechowywania logowania

Nowość na stronie

>

Najbardziej popularny