我一直在 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 值(永远不会改变???) - 虽然我确实在响应标头中返回了具有不同值的设置值......?这似乎有点奇怪。
- 涡轮链接已被删除。
- 使用 Rails 4.0.0 和 Ruby 2.0.0 p247
- 铬和 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 获取我的用户数据,但这并不是特别相关。(AFAIK...)