Spring Security Core authAjax, Как мне игнорировать Referer - PullRequest
4 голосов
/ 12 апреля 2011

Я использую Grails 1.3.7 и последний подключаемый модуль Spring-Security-Core. Я реализовал следующий метод в моем LoginController:

def authAjax = {
   response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
   response.sendError HttpServletResponse.SC_UNAUTHORIZED
}

И в моем глобальном файле JavaScript у меня есть следующее:

$.ajaxSetup({
   error: function(xhr, status, err) {
      if (xhr.status == 401) {
         // display a login form in a dialog
      }
   }
});

Форма входа - это стандартная форма входа непосредственно из документации плагина. Разница лишь в том, что я отправляю свою форму, используя jQuery, вот так:

var params = $('#ajaxLoginForm').serialize();
$.post($('#ajaxLoginForm').attr('action'), params, function(jsonData) {
   if (jsonData.success) {
      $('#login-dialog').dialog('close');
   } else {
      alert('TODO: display errors');
   }
}, 'json');

Проблема в том, что когда я в первый раз нажимаю кнопку входа в систему, мне кажется, что аутентификация в порядке, но ответ, возвращаемый с сервера, представляет собой перенаправление 302, основанное на заголовке запроса Referer. Таким образом, тело моего $ .post () никогда не запускается. Я возвращаю HTML вместо JSON. На самом деле он не ударил мой метод LoginController.ajaxSuccess до второй отправки. Я прочитал и перечитал документацию, и я должен что-то упустить.

ОБНОВЛЕНИЕ: Похоже, что это может не быть проблемой Реферера, так как во второй раз, когда форма публикуется, Реферер все еще там. Поэтому я совершенно не понимаю, почему мне нужно дважды отправить форму для вызова метода ajaxSuccess.

Ответы [ 2 ]

6 голосов
/ 12 апреля 2011

Когда вы делаете неавторизованную попытку доступа к защищенному ресурсу, Spring Security сохраняет этот запрос в вашем сеансе (http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/web/savedrequest/DefaultSavedRequest.html),), а затем, когда вы успешно проходите аутентификацию, перенаправляет вас на этот запрос. Возможно, вы отключите это поведение. через конфигурацию Spring Security, но это, вероятно, не то, что вам нужно для большинства рабочих процессов. Вы также можете явно удалить SavedRequest из сеанса в вашем методе authAjax, но, опять же, это, вероятно, не лучший опыт для пользователя.

Я полагаю, что LoginController.ajaxSuccess получит удар только в том случае, если нет SavedRequest для перенаправления на insted, поэтому возвращаемый HTML-код должен быть результатом вашего исходного запроса, который в то время не был авторизован. Итак, хитрость в том, что вы хотите использовать любую функцию, которую использовали бы для обработки исходного запроса, в качестве метода успеха при отправке #ajaxLoginForm.

0 голосов
/ 22 апреля 2011

Грегг, вы, вероятно, используете поведение контейнера сервлета по умолчанию для 401 ответа. Я рекомендую вам использовать что-то вроде:

def authAjax = {
    response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
    render status: 401, contentType: "application/json", {
    message = "You are not authorized for this page"
    }
}

Я не проверял это, поэтому дайте мне знать, как оно идет.

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