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

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


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


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

Как на 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 создать очень полезную для любого сайта функцию. Даже шифруя пароли пользователей, вы сможете использовать данную систему восстановления пароля.

Grai Просмотров сегодня +3 26 июня 2017 команда сайта
Реклама помогает поддерживать
и развивать наш сервис.


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