Rails / RSpec: reset_session не изменяет значение HTTP-заголовка Set-Cookie во время интеграционных тестов - PullRequest
4 голосов
/ 22 января 2011

Я пишу интеграционный тест, чтобы убедиться, что мое веб-приложение не уязвимо для фиксации сеанса.

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

Вот мой тест интеграции RSpec.

require 'spec_helper'

describe "security" do

  self.use_transactional_fixtures = false

  append_after(:each) do
    ALL_MODELS.each &:delete_all
  end

  describe "session fixation" do
    it "should change the cookie session id after logging in" do

      u = test_user :active_user => true,
                    :username => "nobody@example.com",
                    :password => "asdfasdf"
      u.save!

      https!

      get_via_redirect "/login"
      assert_response :success
      cookie = response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip

      post_via_redirect "/login", "user[email]" => "nobody@example.com",
                                  "user[password]" => "asdfasdf",
                                  "user[remember_me]" => "1"
      assert_response :success
      path.should eql("/dashboard")
      cookie.should_not eql(response.header["Set-Cookie"].split(";").select{|x| x.match(/_session/)}[0].split("=")[1].strip)
    end
  end
end

Все работает за исключением для самого последнего утверждения. Файл cookie не изменяется.

Известны ли какие-либо проблемы с интеграционными тестами RSpec / Rails, когда reset_session не работает должным образом? Что я могу сделать, чтобы написать тест, который проверяет фиксацию сеанса, не является проблемой?

1 Ответ

0 голосов
/ 07 июня 2011

Так что я, в конце концов, все выяснил.

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

В интеграционных тестахВ любом случае, с Rails 2.x есть хеш cookie, который вы можете использовать.Вот как в итоге выглядел тест:

  u = test_user :active_user => true,
                :username => "nobody@example.com",
                :password => "asdfasdf"
  u.save!

  https!

  get_via_redirect "/login"
  assert_response :success
  cookie = cookies['_session']
  cookie.should be_present
  path.should == "/login"

  post_via_redirect "/login", "user[email]" => "nobody@example.com",
                              "user[password]" => "asdfasdf",
                              "user[remember_me]" => "1"
  assert_response :success
  path.should eql("/?login_success=1")
  new_cookie = cookies['_session']
  new_cookie.should be_present
  cookie.should_not eql(new_cookie)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...