【问题标题】:Calling `reset_session` in Rails 4.0.0 not working on 2nd subsequent page在 Rails 4.0.0 中调用“reset_session”在后续第二页不起作用
【发布时间】:2013-08-27 02:57:52
【问题描述】:

我一直在 Rails 4.0.0 中构建一些东西,但我得到了奇怪的会话行为。我有一个将值写入会话的登录过程。它的缺席是我确定用户未登录的方式:

def login
  session[:user_id] = user.id

  #Then we render a simple page...
end

为了验证我的用户是否有效,我的application_controller.rb 中有一个助手:

def current_user
  logger.info  "(current_user) Session ID: #{request.session[:user_id]}"
  if session[:user_id] != nil && session[:user_id] != -1 
    User.find(session[:user_id])
  end
end
helper_method :current_user

从几个不同的地方调用它来检查用户状态并决定如何呈现页面。 (!= -1 解释如下。)注销时我重置会话:

def logout
  reset_session
end

呈现的视图包括对current_user 辅助方法的调用以呈现导航。此页面呈现为我的导航部分显示没有当前用户,并且调试日志显示会话变量已清除。但是,无论我做什么,在下一页它都会恢复到登录状态,并且我突然让用户再次进行身份验证,这样current_user 从会话中获取了正确的值。

我尝试为会话分配不同的值(例如 -1),这具有相同的影响。出于某种原因,我的会话在删除后恢复了。此外,当我使用以下内容时:

def logout
  reset_session
  redirect_to root_path
end

索引页面显示为登录用户。这是令人难以置信的烦人。我很感激我可以使用 Devise 等,但这确实是关于奇怪的会话行为。

我尝试过的事情:

  • rake tmp:sessions:clear 试验没有效果。
  • 用其他东西覆盖会话值。
  • 检查 _my_key cookie 值(它永远不会改变???) - 虽然我确实在响应标头中返回了具有不同值的设置值...?这似乎有点奇怪。
  • Turbo 链接已被删除。
  • 使用 Rails 4.0.0 和 Ruby 2.0.0 p247
  • Chrome 和 Safari...

我完全被这个难住了。哦 - 最后,如果我删除浏览器上的会话 cookie,写入会话也会失败。所以我再也拿不回来了。

更新

这里是登录日志。我已经删除了浏览器中的 cookie,但不是无法注销,而是无法登录:

Started GET "/auth/google_oauth2/callbackstate=***************************&code=***********************************" for 127.0.0.1 at 2013-08-26 18:59:15 +0100 
I, [2013-08-26T18:59:15.307731 #7441]  INFO -- omniauth: (google_oauth2) Callback phase initiated.
Processing by UsersController#callback as HTML
  Parameters: {"state"=>"*************************", "code"=>"****************************"}
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."uid" = '************************' LIMIT 1
(current_user) Session ID: 1
Setting user_id in session: 1 => [1]
  Account Load (2.4ms)  SELECT "accounts".* FROM "accounts" WHERE "accounts"."id" = $1 ORDER BY "accounts"."id" ASC LIMIT 1  [["id", 1]]
Redirected to http://127.0.0.1:3000/pages
Completed 302 Found in 103ms (ActiveRecord: 7.3ms)


Started GET "/Pages" for 127.0.0.1 at 2013-08-26 18:59:16 +0100
Processing by PagesController#index as HTML
(current_user) Session ID: 
  Rendered public/401.html (1.0ms)
Filter chain halted as :is_authenticated rendered or redirected
Completed 401 Unauthorized in 11ms (Views: 10.8ms | ActiveRecord: 0.0ms)

您可以看到标记为(current user) 的两行代码都是对我的辅助方法的调用(如上)。我正在使用 OmniAuth 从 Google OAuth 获取我的用户数据,但这并不是特别相关。 (阿法伊克...)

【问题讨论】:

标签: ruby-on-rails ruby session ruby-on-rails-4


【解决方案1】:

该死的。我试图让这个应用程序多租户,并在我的session_store.rb 中有以下内容:

# Be sure to restart your server when you modify this file.
MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session'

#writes cookies across all subdomain of this site.
Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => ENV['APP_DOMAIN']

显然这很糟糕,会导致您的 cookie 和会话发生各种疯狂的事情。线索应该在_my_key,我认为这是非标准的?我的猜测是我从另一个 SO 问题中得到了这个,但没有完全意识到其中的含义。

【讨论】:

  • 你能解释一下到底是什么问题吗?您的session_store.rb 现在看起来如何?
  • 我不得不删除以 Rails.application... 开头的行,这导致 Rails 将其 cookie 写入不同的键。然后,当我将 cookie 重置为注销时,它失败了。删除此行将恢复为默认行为并解决了问题。
猜你喜欢
  • 2014-08-25
  • 1970-01-01
  • 2020-11-18
  • 2017-06-12
  • 1970-01-01
  • 1970-01-01
  • 2013-04-03
  • 2015-07-18
  • 2017-07-11
相关资源
最近更新 更多