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


X

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

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

Тег big - это увеличение шрифта

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

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

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

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

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

Как на AJAX передать переменные в PHP с выводом результата в блок с проверкой условий без перезагрузки страницы

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

Решил и я написать статью о том, как покупал сайт на бирже ТЕЛДЕРИ

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

Тег abbr - это аббревиатура
Здесь может быть ваша реклама! Блок 3. Настройка рекламы в личном кабинете.

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


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