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


Иногда случается так, что пароль намертво выходит из головы и его приходится восстанавливать. Если на сайте нет автоматической системы восстановления, то администратору придется вручную восстанавливать пользователю пароль. Это тратит и время пользователя, и время администратора, поэтому сегодня мы создадим автоматическую систему восстановления пароля.

Первым делом, как и всегда при работе на MVC нам нужно прописать маршрут, в файле routes.php.

'user/reset_password' => 'user/reset',

 

Далее переходим в папку controller и открываем файл UserController.php. В него нам нужно написать метод, который будет отрисовывать страницу, и обрабатывать данные которые будут получены с формы.

Если нажата кнопка на форме, методом POST получаем данные из формы и записываем их в переменную email. Проверяем, правильно ли введен адрес электронной почты, если нет, то  выводим соответствующее сообщение, иначе, идем далее:

public function actionReset()
{
    $index['title'] = 'Восстановление пароля';
    if (isset($_POST['submit'])) {
        $email = $_POST['email'];
        $email_send = $email;
        if (!User::checkEmail($email)) echo 'Неверно указан E-mail'.'<br>';

 

Проверяем, если ли пользователь с введенным адресом электронной почты существует в базе данных то отправляем ему новый сгенерированный пароль. Если result имеет значение false, то выводим сообщение, что такого пользователя не существует. Иначе в переменную check записываем массив данных пользователя из БД.

В переменную id_user записываем id пользователя из массива check. Теперь с помощью функции generate_password получаем случайный пароль и записываем его в переменную password. Далее, с помощью функции generateHash, хешируем наш случайный пароль.

Далее с помощью функции editPassword меняем пользователю пароль на сгенерированный.

        else
        {
            $result = User::checkUserEmail($email);
            if ($result == true)
            {
                $check = User::checkUserDataHash($email);
                $id_user = $check['id'];
                $password = User::generate_password();
                $hash_password = User::generateHash($password);
                User::editPassword($id_user, $hash_password);

 

Если функция sendEmailPassword, которая отправляет новый пароль на адрес электронной почты, вернула нам true, то показываем пользователю страницу, на которой будет написано, что новый пароль отправлен на почту. Иначе выводим сообщение с ошибкой:

                if (User::sendEmailPassword($email_send,$password))
                {
                    // Подключаем вид
                    require_once(ROOT . '/views/user/reset_password_ok.php');
                    return true;
                } else $errors[] = 'Ошибка почтового клиента';
            } else $errors[] = 'Пользователя с таким E-mail не существует';
        }
    }
    // Подключаем вид
    require_once(ROOT . '/views/user/reset_password.php');
    return true;
}

 

Если какая-то из проверок вернула ошибку, то мы возвращаем пользователя на страницу восстановления пароля и показываем ему ошибки.

Заходим в папку models, открываем файл User.php. В него нам требуется записать следующие функции:

Функция generate_password - генерирует случайный шестизначный пароль, путем выбора случайного элемента из массива:

public static function generate_password($number = 6)
{
    $arr = array('a','b','c','d','e','f',
        'g','h','i','j','k','l',
        'm','n','o','p','r','s',
        't','u','v','x','y','z',
        'A','B','C','D','E','F',
        'G','H','I','J','K','L',
        'M','N','O','P','R','S',
        'T','U','V','X','Y','Z',
        '1','2','3','4','5','6',
        '7','8','9','0');
    // Генерируем пароль
    $pass = "";
    for($i = 0; $i < $number; $i++)
    {
        // Вычисляем случайный индекс массива
        $index = rand(0, count($arr) - 1);
        $pass .= $arr[$index];
    }
    return $pass;
}

 

Функция editPassword – эта функция заменяет пароль полученного пользователя, на указанный пароль:

public static function editPassword($id_user, $hash_password)
{
    // Соединение с БД
    $db = Db::getConnection();
    // Текст запроса к БД
    $sql = "UPDATE users SET password = :password WHERE id = :id";
    // Получение и возврат результатов. Используется подготовленный запрос
    $result = $db->prepare($sql);
    $result->bindParam(':id', $id_user, PDO::PARAM_INT);
    $result->bindParam(':password', $hash_password, PDO::PARAM_STR);
    return $result->execute();
}

 

sendEmailPassword – функция, которая отправляем новый пароль пользователю. В переменные fromMail и fromName пишем адрес электронный почты, с которого будет оправлено письмо и имя отправителя. В переменную emaiTo записываем адрес электронной почты получателя.

В subject и headers задаем параметры, которые будет использовать функция отправки сообщений.

В переменную body записываем текст сообщения, а также переменные с адресом электронной почты и паролем пользователя. Далее выполняем саму функции отправки сообщений – mail. Это стандартная функция PHP, дополнительно ничего дописывать не нужно.

public static function sendEmailPassword($email,$password)
{
    $fromMail = 'admin@goodnets.ru';
    $fromName = 'GOODNETS';
    $emailTo = $email;
    $subject = 'Восстановление пароля ';
    $subject = '=?utf-8?b?'. base64_encode($subject) .'?=';
    $headers = "Content-type: text/plain; charset=\"utf-8\"\r\n";
    $headers .= "From: ". $fromName ." <". $fromMail ."> \r\n";
    $body = "Ваш новый пароль был сгенерирован автоматически, настоятельно рекомендуем изменить его\n
               E-mail: $email\n
               Пароль: $password\n";
    $mail = mail($emailTo1, $subject1, $body1, $headers1, '-f'. $fromMail1 );
    if ($mail) return true;
    else return false;
}

 

Функции checkUserEmail, checkUserDataHash, generateHash описаны в уроках по созданию регистрации и авторизации.

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

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

Основные запросы SQL работа с базой данных PHP

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

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

Тег br - это перенос строки

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

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

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

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

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

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

Тег button - это кнопка

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

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


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