Безопасная авторизация пользователей на MVC и PHP


В этой статье мы разберем, как сделать авторизацию на 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>

 

В итоге мы получаем  безопасную систему авторизации для вашего сайта, также чтобы избежать взлома аккаунта методом перебора паролей, можно установить капчу на авторизацию.

Здесь может быть ваша реклама! Блок 1. Настройка рекламы в личном кабинете.
Grai Просмотров сегодня +1 22 июня 2017 команда сайта
Ещё пока нет комментариев, будь первым!
Оставить комментарий
Здесь может быть ваша реклама! Блок 2. Настройка рекламы в личном кабинете.
   🔔 Отдохните не много, может Вам будет интересно прочитать статьи пользователей нашего сайта.

Тег dd - это определение термина

Подключение к БД и вывод результата на PHP через PDO на MVC

Безопасная авторизация пользователей на MVC и PHP

Тег datalist - это список возможных вариантов

Как проверить радио кнопку checkbox без перезагрузки страницы ajax php

Раскрутка группы Вконтакте с помощью лайков

Тег caption - это заголовок таблицы

Как на MVC с помощью PHP правильно загружать файлы с сервера. Часть Вторая

Как сделать алгоритм поиска по нескольким словам на PHP из БД

Работа с БД на MVC создание модели и выполнение SQL запросов. Часть Вторая

Как сделать модуль бесплатной консультации на ajax

Тег address - это обозначения контактной информации автора
Здесь может быть ваша реклама! Блок 3. Настройка рекламы в личном кабинете.

→ Магазин матрасов в Москве с доставкой по России.
→ Недорогие детские матрасы от 2215 руб!
Реклама Интернет-магазин Каталог матрасов открыт 24 часа, 7 дней в неделю!
www.catalog-matrasov.ru
→ Продажа арендованных лесных участков в РБ от 30 000 руб. Жми сейчас!
РекламаПокупая участок вы получаете выгоду, вам не нужно бегать по инстанциям и заниматься бумажной волокитой, тратя свое время. Вы сразу приобретаете ГОТОВЫЙ БИЗНЕС – лесозаготовительное предприятие.
www.svetobor.com
→ BULLET-SHOP - сварка аргоном, полуавтомат, тюнинг авто!
Реклама Ремонтируем радиаторы, интеркулеры, пайпинг и ВСЁ из алюминия, чугуна, стали с ГАРАНТИЕЙ КАЧЕСТВА. Диагностика и ремонт подвески, трансмиссии, всех узлов и агрегатов
www.bullet-shop.pro
→ Доставка товаров из Китая в кротчайшие сроки без переплат!
Реклама Вам нужен товар из Китая мы с радостью доставим его, а также поможем с выкупом товара с ТаоБао, АлиБаба, 1688.com. Помощь в переводе при заключении сделок!
www.unikorob.ru
Реклама помогает поддерживать
и развивать наш сервис.


Подробнее
(ссылка откроется в новой вкладке)