Авторизация пользователя
Создаем файл модели models/accounts.model.php, а также включаем работу с сессиями в файле config/setup.php и там же задаем секретный ключ в поле 'SecretCode'
class Accounts extends Model
{
protected $name = "Аккаунты";
protected $model_elements = [
["Активировать", "bool", "active", ["on_create" => true]),
["Дата регистрации", "date_time", "date_registration"],
["Дата последнего посещения", "date_time", "date_last_visit", ["now_on_create" => false]),
["Имя", "char", "name", ["required" => true]),
["Email", "email", "email", ["required" => true, "unique" => true]),
["Пароль", "password", "password", ["required" => true, "letters_required" => true,
"digits_required" => true]),
["Телефон", "phone", "phone"]
);
protected function beforeCreate($fields)
{
$salt = $this -> createPasswordSalt();
return ["password" => Service :: makeHash($fields["password"].$salt]);
}
protected function beforeUpdate($id, $old_fields, $new_fields)
{
if($new_fields["password"] != $old_fields["password"])
{
$salt = $this -> createPasswordSalt();
return ["password" => Service :: makeHash($new_fields["password"].$salt]);
}
}
public function createPasswordSalt()
{
$salt = Registry :: get("SecretCode");
//Здесь можно добавить к переменной $salt еще строку
//например $salt .= "hg3HgLi826gfvd)jsh";
return $salt;
}
}
Вносим название модели в файл config/models.php
$mvActiveModels = ['pages', 'blocks', ... , 'accounts'];
Создаем SQL таблицу в базе данных, после чего модель может работать в административной панели
CREATE TABLE `accounts` ( `id` int(11) NOT NULL, `active` tinyint(4) NOT NULL, `date_registration` datetime NOT NULL, `date_last_visit` datetime NOT NULL, `name` varchar(100) NOT NULL, `email` varchar(100) NOT NULL, `phone` varchar(30) NOT NULL, `password` varchar(255) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ALTER TABLE `accounts` ADD PRIMARY KEY (`id`), ADD UNIQUE KEY `id_active` (`id`,`active`); ALTER TABLE `accounts` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
Создаем файл шаблона views/view-login.php и вносим маршрут к шаблону в файл config/routes.php
$mvFrontendRoutes = [ ... , "login/" => "view-login.php", ];
Создаем файл views/main-index-include.php для автоматического определения авторизованного пользователя на каждой странице фронтенда с таким содержимым
$account = $mv -> accounts -> checkAuthorization();
Включаем файл main-index-include.php в корневой файл index.php перед подключением шаблона
$mv = new Builder(); include_once $mv -> views_path."main-index-include.php"; include_once $mv -> router -> defineRoute();
Добавляем методы в модель Accounts
public function generateSessionToken($account)
{
$token = $account -> id.Registry :: get('SecretCode');
$token .= Debug :: browser().session_id();
return md5($token);
}
public function login($email, $password)
{
$account = $this -> find(["email" => $email, "active" => 1]);
$salt = $this -> createPasswordSalt();
if($account && Service :: checkHash($password.$salt, $account -> password))
{
$_SESSION["account"]["id"] = $account -> id;
$_SESSION["account"]["password"] = md5($account -> password);
$_SESSION["account"]["token"] = $this -> generateSessionToken($account);
$account -> date_last_visit = I18n :: getCurrentDateTime();
$account -> update();
return $account;
}
}
public function checkAuthorization()
{
if(isset($_SESSION["account"]["id"], $_SESSION["account"]["password"], $_SESSION["account"]["token"]))
{
$account = $this -> find(["id" => $_SESSION["account"]["id"], "active" => 1]);
if($account && $_SESSION["account"]["password"] == md5($account -> password))
if($_SESSION["account"]["token"] == $this -> generateSessionToken($account))
return $account;
}
}
Содержимое файла шаблона views/view-login.php
$form = new Form("Accounts");
$form -> setRequiredFields(["email", "password"]);
$form -> useTokenCSRF();
if(!empty($_POST))
{
$form -> getDataFromPost() -> validate(["email", "password"]);
if($form -> isValid())
if(!$account = $mv -> accounts -> login($form -> email, $form -> password))
$form -> addError("Неверный email или пароль.");
else
$mv -> redirect("home/"); //Переход на нужный нам URL
$form -> password = "";
}
include $mv -> views_path."main-header.php";
echo $form -> displayErrors();
include $mv -> views_path."main-footer.php";
Теперь на любой странице сайта можно проверить есть ли на сайте авторизованный пользователь
if($account) //Есть авторизованный пользователь
{
echo $account -> name;
}
//Если страница закрыта авторизацией, то отправляем на логин
if(!$account)
$mv -> redirect("login/");
Предыдущий раздел
Каталог с товарами