Безопасная авторизация пользователей на 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>

 

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

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


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