В этой статье мы разберем, как сделать авторизацию на MVC. Будет использоваться вот такая база данных:
Первым делом, добавим маршруты в файле routes.php, он находится в папке config. Задаем следующие маршруты:
'user/login' => 'user/login',
'user/logout' => 'user/logout',
Теперь заходим в папку controllers и открываем файл UserController. В нем нам нужно написать метод для отрисовки страницы авторизации, метод для выхода их системы и функцию, которая будет сравнивать пароли. Метод Login. Чтобы избежать ошибок сразу объявим переменные email и password. Далее, если нажали кнопку «Войти», то методом POST получаем введенные в форме данные:
public function actionLogin()
{
$email = false;
$password = false;
if (isset($_POST['submit'])) {
$email = $_POST['email'];
$password = $_POST['password'];
$errors = false;
Функциями checkEmail и checkPassword проверяем полученные данные на корректность ввода. Эти функции были описаны в уроке по созданию регистрации. С помощью функции checkUserDataHash делаем запрос в базу данных по введенному адресу электронной почты, в результате получаем все данные пользователя с таким адресом электронной почты в переменную check. Затем записываем пароль найденного пользователя в переменную hashed_password, а его id в переменную userId:
$errors[] = 'Неправильный email';
}
if (!User::checkPassword($password)) {
$errors[] = 'Пароль не должен быть короче 6-ти символов';
}
$check = User::checkUserDataHash($email);
$hashed_password = $check['password'];
$userId = $check['id'];
Далее с помощью функции verify проверяем, совпал ли введенный пароль с паролем пользователя найденного по email. Если совпал, то используем функцию auth, которая будет описана далее, а затем возвращаем пользователя на главную страницу. Но если пароль не совпал, то в массив errors записываем сообщение об ошибке:
if ($this->verify($password, $hashed_password)) {
User::auth($userId);
require_once(ROOT . '/user/index.php');
return true;
} else $errors[] = 'Неправильные данные для входа на сайт';
}
require_once(ROOT . '/user/login.php');
return true;
}
Метод Logout. Тут мы удаляем переменную сессии user, затем перенаправляем пользователя на главную страницу.
public function actionLogout()
{
unset($_SESSION["user"]);
session_destroy();
header("Location: /");
return true;
}
Функция verify. Хеширует введенный пароль, сравнивает его с паролем из БД, если пароль совпал, то возвращает true, иначе false.
function verify($password, $hashedPassword) {
return crypt($password, $hashedPassword) == $hashedPassword;
}
Переходим в папку models и открываем файл Users.php. Там создаем следующие функции: checkUserDataHash – функция, которая ищет пользователя по введенному адресу электронной почты, использует обычный предподготовленный запрос:
public static function checkUserDataHash($email)
{
// Соединение с БД
$db = Db::getConnection();
// Текст запроса к БД
$sql = 'SELECT * FROM users WHERE email = :email';
// Получение результатов. Используется подготовленный запрос
$result = $db->prepare($sql);
$result->bindParam(':email', $email, PDO::PARAM_STR);
// Указываем, что хотим получить данные в виде массива
$result->setFetchMode(PDO::FETCH_ASSOC);
$result->execute();
return $result->fetch();
}
Функция auth. При удачной авторизации записывает в переменную сессии значение переменной userId, которое было получено в методе Login.
public static function auth($userId)
{
// Записываем идентификатор пользователя в сессию
$_SESSION['user'] = $userId;
}
Функция isGuest. Проверяет, существует ли переменная user, если да, то это значит, что пользователь авторизирован и он не гость, поэтому отправляет false. Если же переменной не существует, то отправляет true – пользователь гость
public static function isGuest()
{
if (isset($_SESSION['user'])) return false;
else return true;
}
Теперь напишем саму страницу, которая будет содержать форму авторизации. Тут, как и в форме регистрации будет выводиться ошибки, которые могут возникнуть в процессе авторизации. Делается это с помощью цикла foreach, который выводит содержимое массива errors:
<html>
<head></head>
<body>
<div style="color: red; font-size: 14px; padding: 20px; margin: 0 auto; display: block; width:400px;">
<?php if (isset($errors) && is_array($errors)): ?>
<ul>
<?php foreach ($errors as $error): ?>
<li> - <?php echo $error; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>
</div>
Теперь проверяем, если пользователь гость, то есть неавторизированный пользователь, то показываем ему форму авторизации. Если же пользователь авторизирован, то показываем ему сообщение «Вы уже авторизированы».
<?php if (User::isGuest()):
<form action="" method="post" class="form-login" style="display: block; width: 400px; margin: 0 auto; padding: 20px; text-align: center;">
<center><h2>Авторизация</h2></center><br>
<input type="text" name="email" placeholder="E-mail" value="<?php echo $email; ?>"/><br><br><br>
<input type="password" name="password" placeholder="Пароль" value="<?php echo $_POST['password']; ?>"/><br><br><br>
<div class="os"></div>
<input type="submit" name="submit" class="btn btn-default" style="width: 120px;" value="Вход" />
<div class="os"></div>
<div style="font-size: 14px; color: #777;">
Если вы еще по какой то причине не зарегистрированы на нашем сервисе, то не теряйте времени <a href="/register">зарегистрируйтесь</a>.
</div>
</form>
<?php else: ?>
<div style="display: block; width: 400px; margin: 0 auto; background: #f2f1f0; padding: 20px; color:#555; text-align: center;">
<center><h2 style="color:#555;">Вы уже авторизированы </h2></center>
</div>
<?php endif; ?>
</body>
</html>
В итоге мы получаем безопасную систему авторизации для вашего сайта, также чтобы избежать взлома аккаунта методом перебора паролей, можно установить капчу на авторизацию.
Ещё пока нет комментариев, будь первым!