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

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

Как редактировать и удалять новости на MVC и PHP

Недостатки раскрутки групп Вконтакте специальными сервисами

Тег blockquote - это длинная цитата

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

Тег abbr - это аббревиатура

Тег address - это обозначения контактной информации автора

Тег code - это отображение программного кода

Как на MVC и PHP создать систему восстановления доступа с отправкой пароля на адрес электронной почты

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

Как сделать добавление новостей на сайте при помощи MVC и PHP

Ограничение символов вводимых в текстовое поле на JavaScript
Здесь может быть ваша реклама! Блок 3. Настройка рекламы в личном кабинете.

Здесь может быть ваша реклама! Блок 4. Настройка рекламы в личном кабинете.
Создание сайтов и мобильных приложений от 5 500 руб. Любой сложности!
Реклама Собственный фреймворк. Большие и сложные проекты. ТОП 100 разработчиков РФ.
irogex.ru
Магазин матрасов в Москве с доставкой по России. ЦЕНА - от 2000 руб
Реклама Купить матрас с доставкой в Москве и регионах, СКИДКИ до 63%. Лучшие бренды и серии. Интернет-магазин Каталог матрасов открыт 24 часа, 7 дней в неделю!
www.catalog-matrasov.ru
BULLET-SHOP - сварка аргоном, полуавтомат, тюнинг авто!
Реклама Ремонтируем радиаторы, интеркулеры, пайпинг и ВСЁ из алюминия, чугуна, стали с ГАРАНТИЕЙ КАЧЕСТВА. Диагностика и ремонт подвески, трансмиссии, всех узлов и агрегатов
www.bullet-shop.pro
Реклама помогает поддерживать
и развивать наш сервис.


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