Rails/rspec:reset_sesssion統合テスト中にセットクッキーHTTPヘッダー値を変更しない

StackOverflow https://stackoverflow.com/questions/4764126

質問

WebAppがセッション固定に対して脆弱でないことを確認するための統合テストを書いています。

私はそれを手動で検証しました reset_session 実際に認証ロジックを発射しており、さらに、Webブラウザーでログインすると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 期待どおりに機能しませんか?セッションの固定が問題ではないことを検証するテストを書くために何ができますか?

役に立ちましたか?

解決

だから私は最終的にこれを理解することになりました。

私は応答ヘッダーを直接編集してクッキーをテストしようとしていましたが、それは祝福された方法ではないと思います。

とにかくRails 2.xを使用した統合テストでは、使用できるCookiesハッシュがあります。これがテストのように見えたものです:

  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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top