Авторизация пользователя
Создаем файл модели models/accounts.model.php, а также включаем работу с сессиями в файле config/setup.php и там же задаем секретный ключ в поле 'SecretCode'
<? class Accounts extends Model { protected $name = "Аккаунты"; protected $model_elements = array( array("Активировать", "bool", "active", array("on_create" => true)), array("Дата регистрации", "date_time", "date_registration"), array("Дата последнего посещения", "date_time", "date_last_visit", array("now_on_create" => false)), array("Имя", "char", "name", array("required" => true)), array("Email", "email", "email", array("required" => true, "unique" => true)), array("Пароль", "password", "password", array("required" => true, "letters_required" => true, "digits_required" => true)), array("Телефон", "phone", "phone") ); protected function beforeCreate($fields) { $salt = $this -> createPasswordSalt(); return array("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 array("password" => Service :: makeHash($new_fields["password"].$salt)); } } public function createPasswordSalt() { $salt = $this -> registry -> getSetting("SecretCode"); //Здесь можно добавить к переменной $salt еще строку //например $salt .= "hg3HgLi826gfvd)jsh"; return $salt; } } ?>
Вносим название модели в файл config/models.php
$mvActiveModels = array('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 = array( ... , "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.$this -> registry -> getSetting('SecretCode'); $token .= Debug :: browser().session_id(); return md5($token); } public function login($email, $password) { $account = $this -> findRecord(array("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 -> findRecord(array("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(array("email", "password")); $form -> useTokenCSRF(); if(!empty($_POST)) { $form -> getDataFromPost() -> validate(array("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(); ?> <form method="post" action="<? echo $mv -> root_path; ?>login/"> <table> <? echo $form -> display(array("email", "password")); ?> </table> <div class="form-buttons"> <? echo $form -> displayTokenCSRF(); ?> <input type="submit" value="Вход" /> </div> </form> <? include $mv -> views_path."main-footer.php"; ?>
Теперь на любой странице сайта можно проверить есть ли на сайте авторизованный пользователь
<? if($account) //Есть авторизованный пользователь { echo $account -> name; } //Если страница закрыта авторизацией, то отправляем на логин if(!$account) $mv -> redirect("login/"); ?>