Додому Інше Точний index php user registration. Проста система реєстрації користувачів

Точний index php user registration. Проста система реєстрації користувачів

Процес створення системи реєстрації – це досить великий обсяг роботи. Вам потрібно написати код, який би перевіряв ще раз валідність email-адрес, висилав email-листи з підтвердженням, пропонував можливість відновити пароль, зберігав би паролі в безпечному місці, перевіряв форми введення та багато іншого. Навіть коли ви все це зробите, користувачі будуть реєструватися неохоче, тому що навіть найменша реєстрація вимагає їхньої активності.

У сьогоднішньому посібнику ми займемося розробкою простої системи реєстрації, за допомогою якої вам не знадобляться жодні паролі! У результати ми отримаємо систему, яку можна буде легко змінити або вбудувати в існуючий PHP-сайт. Якщо вам цікаво, читайте далі.

PHP

Тепер ми готові зайнятися кодом PHP. Основний функціонал системи реєстрації надається класом User, який ви можете побачити нижче. Клас використовує (), що є мінімалістською бібліотекою для роботи з базами даних. Клас User відповідає за доступ до баз даних, генерування token-ів для логіну та їх валідації. Він представляє нам простий інтерфейс, який можна легко включити в систему реєстрації на ваших сайтах, заснованих на PHP.

User.class.php

// Private ORM instance
private $orm;

/**
* Find a user by a token string. Тільки valid tokens are taken into
* consideration. A token is valid for 10 minutes after it has been generated.
* @param string $token The token to search for
* @return User
*/

Public static function findByToken($token)(

// Find it in the database and make sure the timestamp is correct


->where("token", $token)
->where_raw("token_validity > NOW()")
->find_one();

If(!$result)(
return false;
}

Return new User($result);
}

/**
* Either login або register a user.
* @return User
*/

Public static function loginOrRegister($email)(

// If such a user already exists, return it

If(User::exists($email))(
return new User($email);
}

// Otherwise, create it and return it

Return User::create($email);
}

/**
* Create a new user and save it to the database
* @param string $email The user"s email address
* @return User
*/

Private static function create($email)(

// Write a new user to the database and return it

$result = ORM::for_table("reg_users")->create();
$result->email = $email;
$result->save();

Return new User($result);
}

/**
* Check whether such a user exists in the database and return a boolean.
* @param string $email The user"s email address
* @return boolean
*/

Public static function exists($email)(

// Does the user exist in the database?
$result = ORM::for_table("reg_users")
->where("email", $email)
-> count ();

Return $result == 1;
}

/**
* Create a new user object
* @param $param ORM instance, id, email або null
* @return User
*/

Public function __construct($param = null)(

If($param instanceof ORM)(

// An ORM instance was passed
$this->orm = $param;
}
else if(is_string($param))(

// An email was passed
$this->
->where("email", $param)
->find_one();
}
else(

If(is_numeric($param))(
// A user id was passed as a parameter
$id = $param;
}
else if(isset($_SESSION["loginid"])))(

// No user ID був passed, look into the sesion
$id = $_SESSION["loginid"];
}

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

/**
* Generates a new SHA1 login token, writes it to the database and returns it.
* @return string
*/

Public function generateToken()(
// generate a token for the logged in user. Save it to the database.

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

// Save the token to the database,
// and mark it as valid for the next 10 minutes only

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

Return $token;
}

/**
* Login this user
* @return void
*/

Public function login()(

// Mark the user as logged in
$_SESSION["loginid"] = $this->orm->id;

// Update the last_login db field
$this->orm->set_expr("last_login", "NOW()");
$this->orm->save();
}

/**
* Destroy the session and logout the user.
* @return void
*/

Public function logout()(
$_SESSION = array();
unset($_SESSION);
}

/**
* Check whether the user is logged in.
* @return boolean
*/

Public function loggedIn()(
return isset($this->orm->id) && $_SESSION["loginid"] == $this->orm->id;
}

/**
* Check whether the user is an administrator
* @return boolean
*/

Public function isAdmin()(
return $this->rank() == "administrator";
}

/**
* Find the type of user. It can be either admin або regular.
* @return string
*/

Public function rank()(
if($this->orm->rank == 1)(
return "administrator";
}

Return "regular";
}

/**
* Magic method for accessing the elements of the private
* $orm instance as properties of the user object
* @param string $key Accessed property"s name
* @return mixed
*/

Public function __get($key)(
if(isset($this->orm->$key))(
return $this->orm->$key;
}

Return null;
}
}
Token-и генеруються за допомогою алгоритму і зберігаються в базу даних. Ми використовуємо з MySQL для встановлення значення в колонку token_validity, що дорівнює 10 хвилин. При валідації token, ми повідомляємо движку, що нам потрібен token, поле token_validity поки що не закінчилося. Таким чином ми обмежуємо час, протягом якого token буде валідним.

Зверніть увагу, що ми використовуємо чарівний метод __get () в кінці документа, щоб отримати доступ до властивостей об'єкта user. Це дозволяє нам здійснити доступ до даних, які зберігаються у базі даних у вигляді властивостей: $user->email, $user->token. Для прикладу давайте подивимося, як ми можемо використовувати цей клас у наступному фрагменті коду:


Ще один файл, в якому зберігається потрібний функціонал, це functions.php. Там у нас є кілька допоміжних функцій, які дозволяють нам зберегти решту коду більш охайним.

Functions.php

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

// Helper function for sending email

$headers = "MIME-Version: 1.0" . "\r\n";
$headers .= "Content-type: text/plain; charset=utf-8" . "\r\n";
$headers .= "From: ".$from . "\r\n";

Return mail($to, $subject, $message, $headers);
}

function get_page_url()(

// Find out the URL of a PHP file

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

// Номер login attempts for last hour by this IP address

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

// Номер login attempts for last 10 minutes by this IP address

$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("Too many login attempts!");
}
}

function rate_limit_tick($ip, $email)(

// Create a new record in the login attempt table

$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;
}
Функції rate_limit та rate_limit_tick дозволяють нам обмежувати кількість спроб авторизації на певний проміжок часу. Спроби авторизації записуються до бази даних reg_login_attempt. Ці функції запускаються під час проведення підтвердження форми авторизації, як можна побачити у наступному фрагменті коду.

Нижченаведений код узяли з index.php, і він відповідає за підтвердження форми авторизації. Він повертає JSON-відповідь, яка управляється кодом jQuery, який ми бачили в assets/js/script.js.

index.php

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

// Output a JSON header

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

// Is the email address valid?

If(!isset($_POST["email"]) || !filter_var($_POST["email"], FILTER_VALIDATE_EMAIL))(
throw new Exception("Please enter a valid email.");
}

// Це буде запропонувати, якщо людина не з'явиться
// Застосування Login при обмеженнях (see functions.php for more):
rate_limit($_SERVER["REMOTE_ADDR"]);

// Record this login attempt
rate_limit_tick($_SERVER["REMOTE_ADDR"], $_POST["email"]);

// Send the message to the user

$message = "";
$email = $_POST["email"];
$subject = "Your Login Link";

If(!User::exists($email))(
$subject = "Thank You For Registering!";
$message = "Якщо ви зареєструєтеся на нашому сайті!\n\n";
}

// Attempt to login or register the person
$user = User::loginOrRegister($_POST["email"]);

$message.= "Ви можете підписатися з цієї URL:\n";
$message.= get_page_url()."?tkn=".$user->generateToken()."\n\n";

$message.= "Отправляється expire автоматично після 10 хвилин.";

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

If(!$result)(
throw new Exception("There was an error sending your email. Please try again.");
}

Die(json_encode(array(
"message" => "Thank you! We\"ve sent a link to your inbox. Check your spam folder as well."
)));
}
}
catch(Exception $e)(

Die(json_encode(array(
"error"=>1,
"message" => $e->getMessage()
)));
}
При успішній авторизації або реєстрації, наведений вище код відсилає email людині з посиланням для авторизації. Token (лексема) стає доступною як $_GET-змінною "tkn" через згенеровану URL.

index.php

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

// Is this a valid login token?
$user = User::findByToken($_GET["tkn"]);

// Yes! Підключити користувача і переглянути сторінку.

$user->login();
redirect("protected.php");
}

// Invalid token. Redirect back to the login form.
redirect("index.php");
}
Запуск $user->login() створить необхідні змінні для сесії, що дозволить користувачеві залишатися авторизованим під час наступних входів.

Вихід із системи реалізується приблизно так само:

Index.php

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

$user = новий User();

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

Redirect("index.php");
}
Наприкінці коду ми знову перенаправляємо користувача на index.php, тому параметр logout = 1 в URL виключається.

Наш файл index.php також потребує захисту – ми не хочемо, щоб вже авторизовані користувачі бачили форму. Для цього ми використовуємо метод $user->loggedIn():

Index.php

$user = новий User();

if($user->loggedIn())(
redirect("protected.php");
}
Нарешті, давайте подивимося, як можна захистити сторінку вашого сайту, і зробити її доступною лише після авторизації:

protected.php

// Щоб захистити будь-яку php page on your site, include main.php
// and create a new User object. It's that simple!

require_once "includes/main.php";

$user = новий User();

if(!$user->loggedIn())(
redirect("index.php");
}
Після цієї перевірки ви можете бути впевнені, що користувач успішно авторизувався. У вас також буде доступ до даних, які зберігаються в базі даних як властивості об'єкта $user. Щоб вивести email користувача та їх ранг, скористайтеся наступним кодом:

Echo "Your email: ".$user->email;
echo "Your rank: ".$user->rank();
Тут rank() – це метод, оскільки колонка rank у базі даних зазвичай містить числа (0 для звичайних користувачів та 1 для адміністраторів), і нам потрібно перетворити це все на назви рангів, що реалізується за допомогою даного методу. Щоб перетворити звичайного користувача на адміністратора, просто відредагуйте запис про користувача в phpmyadmin (або в будь-якій іншій програмі роботи з базами даних). Будучи адміністратором, користувач не буде наділений особливими можливостями. Ви самі маєте право вибирати, яким правом наділяти адміністраторів.

Готово!

На цьому наша просте система реєстрації готова! Ви можете використовувати її на вже існуючому PHP-сайті або модернізувати її, дотримуючись власних вимог.

Hello, friends in this tutorial we will learn user registration and login using PHP stored procedure.
File structure for this tutorial
config.php
index.php
check_availability.php
login.php
welcome.php
logout.php
Structure of sql table 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

Create db configuration file using mysqli extension. Provide credential as per your configuration

index.php

Create a html form for user registration.

Register Full Name E-mail Password

Всі зареєстровані. login here

Jquery / Ajax for user email availability

check_availability.php

На цій сторінці ми будемо керувати електронною поштою електронної пошти. Create a store procedure with name check availability
Store procedure code:

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

Новий create a store procedure for user registration.
Store procedure for user registration

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `registration` (IN `fname` VARCHAR(200), IN `emailid` VARCHAR(200), IN `password` VARCHAR(255)) NO SQL insert into tblregistration( FullName,EmailId,Password) VALUES(fname,emailid,password)$ DELIMITER ;

Після створення стратегічного режиму execute store procedure.

Тут є повний код, який буде написано для реєстрації (index.php ):

Registration using Store Procedure function checkAvailability() ( $("#loaderIcon").show(); jQuery.ajax(( url: "check_availability.php", data:"emailid="+$("#email").val) (), type: "POST", success:function(data)( $("#user-availability-status").html(data); $("#loaderIcon").hide(); ), error:function ()() )); ) Register Full Name E-mail Password

Всі зареєстровані. login here

login .php

Create a login form user login.

login

Чи не registered? Create an account

Новий create a store procedure for login with name login.
Login store procedure:

DELIMITER $ CREATE DEFINER=`root`@`localhost` PROCEDURE `login` (IN `useremail` VARCHAR(255), IN `password` VARCHAR(255)) NO SELECT EmailId password$ DELIMITER ;

Now execute the login store procedure

Нове на сайті

>

Найпопулярніше