Облако ссылок Добавить сайт Опубликовать Пользователи Категории

Сервис полезной информации


Размещайте полезную информацию и одновременно продвигайте свои проекты.


Узнать больше

Безопасная авторизация пользователей на 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 Просмотров сегодня +1 22 июня 2017 команда сайта
Реклама помогает поддерживать
и развивать наш сервис.


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