会话不会在Rails中持续4

jas*_*328 3 ruby session ruby-on-rails ruby-on-rails-4

更新:

我确定我可以在其他操作中更改会话,但是如果我在POST请求中设置了会话,则它不会持续.如果我将操作从a更改POST为a GET,则会话仍然存在.

原始问题:

我有一个Rails 4.2.0.rc3应用程序.每当用户登录时,会话将分配给该用户的ID.但是,当我运行该current_user方法时,会话不会持续.我secret_key_basesecret.yml文件中有一个.这是我的会话助手.

module SessionsHelper
  def sign_in(user)
    session[:id] = user.id

    puts "signing in" * 100

    puts session[:id].inspect
  end

  def signed_in?
    current_user.present?
  end


  def current_user
    puts "checking session" * 100

    puts session[:id].inspect

    Avatar.find_by(id: session[:id])
  end
end
Run Code Online (Sandbox Code Playgroud)

在我的日志文件中,我看到session[:id]已设置.当运行另一个动作并current_user调用该方法时,该session[:id]值为零.怎么了,怎么解决这个问题?

jro*_*ind 6

嗯,由你的更新触发,这只发生在POST,我记得不完整的几件事.

  • Rails具有CSRF保护,但默认情况下仅应用于POST,而不是GET

  • 在CSRF失败的情况下,defualt Rails CSRF保护逻辑将默默使用新的Session而不是提升.(我认为这是个人默认的糟糕选择).

我想知道这是不是正在发生的事情.

要找出答案,您希望告诉您的Rails应用程序实际上在CSRF失败时引发异常失败,而不是默默地使用新的孤立会话.

在你的app/controllers/application_controller.rb,寻找行protect_from_forgery,并改为 protect_from_forgery with: :exception,告诉Rails实际上提出CSRF失败.(实际上,看起来Rails 4.x应用程序现在是使用这个新版本的行生成的,但如果你有一个应用程序,你将从3.x升级,它将不会.来自railsdiff的 Hooray 用于制作它可以轻松调查rails new rails版本中生成的代码的变化).

如果您在演示测试用例中遇到异常,那么了解问题所在,您可以找出合适的解决方案:要么使用正确的CSRF保护获取POST请求,要么为该操作关闭CSRF保护.如果它是API类型的请求,您可能不需要CSRF保护.

有关此类问题的更多背景阅读,请参阅:

那听起来像你的问题吗?