Разработка выхода из системы при попытке уничтожить объект (Rails 3.0.5 и Devise 1.1.8) - PullRequest
7 голосов
/ 13 марта 2011

Я обновился до Rails 3.0.5 и Devise 1.1.8.Когда я пытаюсь удалить любой объект (через представление с: remote => true), я получаю диалог аутентификации, и сеанс Devise уничтожается.Затем я должен снова войти в систему, и объект все еще там ... у кого-нибудь еще есть эта проблема?Есть идеи, как ее решить?

Большое спасибо.

Ответы [ 4 ]

16 голосов
/ 16 марта 2011

Эта проблема не связана с Devise. Вкратце, начиная с Rails 3.0.4 требуется, чтобы каждый не-GET-запрос имел токен CSRF, в противном случае сеанс очищается.

В этом есть два основных изменения исправить поведение при CSRF защита не изменилась, и токен теперь потребуется для всех запросы не GET.

После применения этого патча произошел сбой CSRF запросы больше не будут генерировать HTTP 500 ошибок, вместо сеанса сбросить . Пользователи могут переопределить это поведение путем переопределения handle_unverified_request в своем собственном контроллеры.

Подробнее здесь: http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails

Фрагмент jQuery для использования с вашими запросами AJAX

$(document).ajaxSend(function(e, xhr, options) {
  var token = $("meta[name='csrf-token']").attr("content");
  xhr.setRequestHeader("X-CSRF-Token", token);
});

Если вы используете прототип, вам понадобится следующий код:

Ajax.Responders.register({
  onCreate: function(request) {
    var csrf_meta_tag = $$('meta[name=csrf-token]')[0];

    if (csrf_meta_tag) {
      var header = 'X-CSRF-Token',
          token = csrf_meta_tag.readAttribute('content');

      if (!request.options.requestHeaders) {
        request.options.requestHeaders = {};
      }
      request.options.requestHeaders[header] = token;
    }
  }
});
4 голосов
/ 11 мая 2011

У меня была такая же проблема с отсутствием вызовов ajax destroy, оказывается, я просто пропустил <% = csrf_meta_tag%> в заголовке моих старых макетов.

2 голосов
/ 20 апреля 2011

Я использую rails 3.0.5 и просто заменяю мой public / javascript / rails.js на последнюю версию (https://github.com/rails/jquery-ujs/blob/master/src/rails.js), исправившую эту проблему !!

PS: Это rails.js следует использовать, когда вы используете только jquery!

0 голосов
/ 15 марта 2011

У меня была такая же проблема в Rails 3.0.5 + Devise (1.x + 1.2RC): пользователь выходит из системы по определенным AJAX-запросам.

На данный момент единственное решение, позволяющее избежать этого, - это понизить Rails до 3.0.3.

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