Сохранение данных HTTP POST, когда запрос прерывается страницей входа - PullRequest
4 голосов
/ 10 сентября 2008

Скажем, пользователь просматривает веб-сайт, а затем выполняет какое-то действие, которое меняет базу данных (скажем, они добавляют комментарий). Однако, когда поступает запрос на фактическое добавление комментария, мы обнаруживаем, что должны заставить их войти в систему, прежде чем они смогут продолжить.

Предположим, что на странице входа запрашивается имя пользователя и пароль, и перенаправляет пользователя обратно на URL-адрес, на который он шел, когда требовался вход в систему. Этот редирект работает для URL-адреса только с параметрами GET, но если запрос изначально содержал некоторые данные HTTP POST, теперь он теряется.

Кто-нибудь может порекомендовать способ справиться с этим сценарием, когда задействованы данные HTTP POST?

Очевидно, что при необходимости страница входа в систему может динамически генерировать форму со всеми параметрами POST для их передачи (хотя это выглядит грязно), но даже в этом случае я не знаю способа перенаправления страницы входа в систему пользователь на своей предполагаемой странице, сохраняя данные POST в запросе.


Редактировать : одно дополнительное ограничение, которое я должен был прояснить - представьте, что мы не знаем, потребуется ли вход в систему, пока пользователь не отправит свой комментарий. Например, срок их файла cookie может истек после загрузки формы и фактического отправки комментария.

Ответы [ 6 ]

11 голосов
/ 10 сентября 2008

Это хорошее место, где могут быть полезны техники Ajax. Когда пользователь нажимает кнопку отправки, отобразите диалоговое окно входа на стороне клиента и подтвердите его на сервере, прежде чем вы действительно отправите страницу.

Другой способ, которым я могу придумать, - это динамическое отображение или скрытие элементов управления входом в тег DIV на самой главной странице.

3 голосов
/ 10 сентября 2008

Возможно, вы захотите выяснить, почему Django удалил эту функцию , прежде чем применять ее самостоятельно. Это не похоже на проблему, специфичную для Django, а на очередную мошенническую атаку.

2 голосов
/ 10 сентября 2008

2 варианта:

  1. Запишите беспорядочную форму со страницы входа в систему и JavaScript form.submit () на страницу.
  2. Получить саму страницу входа в систему POST к запрашивающей странице (с предыдущими значениями) и заставить контроллер этой страницы выполнить проверку входа в систему. Сверните это в любую логику, которую вы уже используете для обнаружения не вошедшего в систему пользователя (рамки зависят от того, как они это делают). В псевдо-MVC:

        CommentController {
           void AddComment() {
             if (!Request.User.IsAuthenticated && !AuthenticateUser()) {
                return;
             }
             // add comment to database
           }

           bool AuthenticateUser() {
             if (Request.Form["username"] == "") {
                // show login page
                foreach (Key key in Request.Form) {
                   // copy form values
                   ViewData.Form.Add("hidden", key, Request.Form[key]);
                }
                ViewData.Form.Action = Request.Url;

                ShowLoginView();
                return false;
              } else {
                 // validate login
                 return TryLogin(Request.Form["username"], Request.Form["password"]);
              } 
           }
        }
2 голосов
/ 10 сентября 2008

Просто сохраните все необходимые данные из POST в сеансе до завершения процесса входа. Или иметь какую-то временную таблицу в БД для хранения, а затем извлечь ее. Очевидно, это псевдокод, но:

if ( !loggedIn ) {
    StorePostInSession();
    ShowLoginForm();
}

if ( postIsStored ) {
    RetrievePostFromSession();
}

Или что-то в этом роде.

1 голос
/ 10 сентября 2008

Я знаю, что это говорит о независимости от языка, но почему бы не воспользоваться преимуществами соглашений, предоставляемых языком на стороне сервера, который вы используете? Если бы это была Java, данные можно было бы сохранить, установив атрибут Request. Вы будете использовать контроллер для обработки формы, определения имени входа и последующей пересылки. Если атрибуты установлены, то просто предварительно заполните форму этими данными?

Редактировать: Вы также можете использовать сеанс, как указано, но я вполне уверен, что если вы используете переадресацию в Java обратно на страницу входа, атрибут Request будет сохранен.

1 голос
/ 10 сентября 2008

Соберите данные на странице, которую они отправили, и сохраните их в своем бэкэнде (базе данных?), Пока они проходят через последовательность входа в систему, скрывают идентификатор транзакции или аналогичный на странице с формой входа. Когда все будет готово, верните их на страницу, которую они запрашивали, просмотрев ее с помощью идентификатора транзакции на сервере, и выгрузите все данные, которые они опубликовали, в форму для предварительного просмотра, или просто запустите любой код, который будет запускать эта страница.

Обратите внимание, что многие системы, например блоги, обходят это, имея поля входа в систему в той же форме, что и для публикации комментариев, если пользователю необходимо войти в систему, чтобы комментировать, а это еще не сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...