За последние 24 часа нас посетили 110289 программистов и 7637 роботов. Сейчас ищут 1949 программистов ...

Запретить выводить форму входа повторно

Тема в разделе "PHP для новичков", создана пользователем _ne_scaju_, 24 авг 2018.

  1. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    Всем привет, сейчас попробовал то что вы говорили вроде получилось, проверил в самом конце скрипта, верное решение судить вам, код привожу:
    PHP:
    1.     public function actionLogin()
    2.     {
    3.        # создаем объект класса User()
    4.        $user = new User();
    5.  
    6.        # Проверяем какой метод используется на веб странице
    7.        if ( $_SERVER['REQUEST_METHOD'] == 'POST' )
    8.        {
    9.            # фильтруем данные
    10.            $checkARGS = [
    11.                 'user_login' => FILTER_SANITIZE_STRING,
    12.                 'user_password' => FILTER_SANITIZE_STRING
    13.             ];
    14.  
    15.             $inputFIELD = filter_input_array(INPUT_POST, $checkARGS);
    16.  
    17.            # Проверяем существует ли пользователь
    18.            $userID = $user->checkUserData($inputFIELD['user_login'], $inputFIELD['user_password']);
    19.  
    20.            # проверяем на ошибки, если их нет попадаем в кабинет.
    21.            if ($userID === true)
    22.            {
    23.                # Перенаправляем его в личный кабинет
    24.                header("Location: /cabinet");
    25.                exit;
    26.             }else{
    27.                 $_SESSION['errors'][] = $userID;
    28.                 header('Location: /user/login');
    29.                 exit;
    30.             }
    31.         }
    32. /*или такая запись  if($user->isGuest() == true) обе работают, какая будет стабильней?*/
    33.         if($user->isGuest() === true)
    34.         {
    35.            # Подключаем наш шаблон
    36.            require_once(ROOT . '/views/user/login.php');
    37.            return true;
    38.         }else{
    39.            # Перенаправляем его в личный кабинет
    40.            header("Location: /cabinet");
    41.            exit;
    42.         }
    43.     }
    И метод который проверяет гость или не гость в самом низу его вызываю и сверяю со значением true:
    PHP:
    1.     public function isGuest()
    2.     {
    3.         if (isset($_SESSION['uid']))
    4.         {
    5.             return false;
    6.         }
    7.         return true;
    8.     }
    Правильно ли я делаю проверку user-а, на показ шаблона или редиректа?
     
    #26 _ne_scaju_, 31 авг 2018
    Последнее редактирование: 31 авг 2018
  2. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @_ne_scaju_, пароль не надо фильтровать его надо хешировать.
     
  3. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    в данный момент я спрашиваю за вывод шаблона и его проверку.
    а на счет пароля я его шифрую методом password_hash(), просто для него еще фильтр применил,
    ах да забыл, хешировать при проверки полей не думаю?
    Эта же фильтрация делается для проверки полей соответствуют ли они действительности данных, которые поступают в форму, если ошибаюсь поправте.

    еще вопрос, какая запись будет правильней?
    такая запись:
    PHP:
    1. if($user->isGuest() == true)
    или эквивалентна будет правильней?
    PHP:
    1. if($user->isGuest() === true)
    или вообще хватило бы и такой записи без сравнения?
    PHP:
    1. if($user->isGuest())
    Вопрос на засыпку, нужна ли эта проверка при выводе формы например, редактирование данных или любой другой страницы?
     
    #28 _ne_scaju_, 31 авг 2018
    Последнее редактирование: 31 авг 2018
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Ну лично я бы первыми строчками сделал
    PHP:
    1. if (!$user->isGuest()) {
    2.    # Перенаправляем его в личный кабинет
    3.           header("Location: /cabinet");
    4.            exit;
    5. }
    Но так, как у тебя, тоже должно работать, по идее
    --- Добавлено ---
    Первыми сточками в Action, конечно же :)
     
    _ne_scaju_ нравится это.
  5. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    первыми строчками не срабатывает, а вот в конце срабатывает.
     
  6. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    а как закрыть страницу смены пароля? если он просто перешел по пути в адресной строке, вообще не догоняю, что проверить нужно, ключ или id?
    Этот метод с проверкой формы не подходит, всегда высвечивается форма.
    --- Добавлено ---
    так тоже сработало.
     
    AlexProg нравится это.
  7. AlexProg

    AlexProg Активный пользователь

    С нами с:
    13 май 2014
    Сообщения:
    320
    Симпатии:
    7
    PHP:
    1. if(!isset($_SESSION["user_id"])){ header("Location: /"); return; }
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Аналогично. В начале нужной action ставишь проверку. В фреймворках есть механизмы, которые прямо на роутер вешаются (называются "посредники", middleware), но самостоятельно написать такой роутер - я не уверен, что ты потянешь
     
    _ne_scaju_ нравится это.
  9. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    сделал вот таким образом:
    PHP:
    1.         if(!$user->isGuest() && !isset($_SESSION['r_uid']))
    2.         {
    3.             # Перенаправляем его в личный кабинет
    4.            header("Location: /cabinet");
    5.             exit;
    6.         }
    первая проверка проверяет является ли пользователь гостем, вторая проверка проверяет не находиться ли restore_uid в сессии если нет редирект на ту же страницу кабинет.
     
  10. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    хорошо, с этим справился, вопрос такой, при проверке например ключа, я создаю ссессию и использую ее в другом контроллере, при успешном завершении, в какой момент мне нужно уничтожить сессию перед редиректом?
    --- Добавлено ---
    хотя так не работает, работает только по отдельности,
    сработало с оператором ИЛИ || почему так?
     
    #35 _ne_scaju_, 1 сен 2018
    Последнее редактирование: 1 сен 2018
  11. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    Странные дела творятся. Гость должен быть по умолчанию, условие обычно вешают на зарегистрированных пользователей
     
    _ne_scaju_ нравится это.
  12. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    понимаешь если не проверить гость ли он, а на самом деле находится в кабинете, то он сможет открыть страницу доступную только гостям) и наоборот доступную только авторизованным, думаю всегда лучше проверять.
     
  13. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Какого такого ключа?
     
  14. Valick

    Valick Активный пользователь

    С нами с:
    12 авг 2018
    Сообщения:
    1.907
    Симпатии:
    327
    @_ne_scaju_, знаете почему некоторые люди при всём желании не смогут стать программистами? Просто у них нет логики.
     
    _ne_scaju_ нравится это.
  15. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ай то я вообще написал, например я сохранил в сессии ключ из базы ну или ID, при успешном завершении когда нужно уничтожать эти данные?
    --- Добавлено ---
    у меня логика присутствует)
     
  16. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Ужас!))
    PHP:
    1. public function isGuest() {
    2.   return !isset($_SESSION['uid']);
    3. }
     
  17. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    смысле ужас, ты коротко написал, а в случае не удачи возврата нет у тебя
    мне вернуть нужно удачу или лож, а где в твоем случае лож?
    и вообще я уже проверку сделал, и она работает, оставил этот метод который ты критикуешь, хотя его можно меньше сделать в одну строку.
     
  18. acso

    acso Активный пользователь

    С нами с:
    15 апр 2010
    Сообщения:
    150
    Симпатии:
    25
    Адрес:
    Одесса
    Чёта я не понимаю) В моем варианте если установлено значение $_SESSION['uid'], то будет false (не гость), не установлено - true (гость).
     
  19. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    ах ну да точно, предлагаешь переделать уменьшить код? на 3 строки)
     
  20. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Ну намой взгляд тоже, глупо писать:
    PHP:
    1. if ($condition) {
    2.     return true;
    3. } else {
    4.    return false;
    5. }
    если можно просто
    PHP:
    1. return $condition;
     
  21. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    да можно наверное, но так вообще будет не понятно что и зачем оно нужно)
    уж лучше видеть false или true.
    или ты советуешь писать так как мне показали?
     
  22. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.497
    Симпатии:
    1.726
    Если знаешь php, то понятно. В целом, зависит от условия. И если условие укладывается в isset($_SESSION["user_id"]) - то безусловно. Если же какое-нибудь условие на 5-6 строчек, то лучше разбить на несколько операторов или даже функций.

    В твоём случае, всё понятно из названия функции.
     
    acso и _ne_scaju_ нравится это.
  23. _ne_scaju_

    _ne_scaju_ Старожил

    С нами с:
    25 ноя 2016
    Сообщения:
    2.149
    Симпатии:
    118
    хорошо так и сделаю, если не забуду.