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


X

Безопасная авторизация пользователей на 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 Просмотров сегодня +10 22 июня 2017 команда сайта
Ещё пока нет комментариев, будь первым!
Оставить комментарий
Здесь может быть ваша реклама! Блок 2. Настройка рекламы в личном кабинете.
   🔔 Отдохните не много, может Вам будет интересно прочитать статьи пользователей нашего сайта.

Тег applet - это апплет

Тег area - это область ссылки

Как на MVC при помощи PHP создать регистрацию с хешированием пароля

Как разрезать изображение на части и склеить обратно из фрагментов, используя PHP и Ajax

Тег article - это статья

Как на MVC с помощью PHP загружать изображения на сервер

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

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

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

Тег a - это ссылка

Тег audio - это управление аудиофайлом

Как добавить свой сайт в поисковые системы GOOGLE и YANDEX
Здесь может быть ваша реклама! Блок 3. Настройка рекламы в личном кабинете.

Здесь может быть ваша реклама! Блок 4. Настройка рекламы в личном кабинете.
Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
irogex.ru
Конструкторы Ugears купить в Иркутске от 690 руб. с Доставкой!
Реклама UGEARS это путешествие в удивительную атмосферу гармонии природы и совершенства конструкторской мысли
ugears-irk.ru
Стоматология в Улан-Удэ | ДентаВита | Шок цены от 100 руб!
Реклама От всей нашей семьи хотим выразить огромную благодарность стоматологической клинике
dentavita03.ru
Реклама помогает поддерживать
и развивать наш сервис.


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