Авторизация пользователя
Создаем файл модели 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/");
Предыдущий раздел
Каталог с товарами