我一直在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 Links已被删除.
>使用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)
您可以看到标记为(当前用户)的两行,这两行都是对我的帮助方法的调用(如上所述).我使用OmniAuth从Google OAuth获取用户数据,但这并不是特别相关. (据我所知…)
最佳答案 该死的.我试图让这个应用程序多租户,并在我的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中,我认为这是非标准的?我的猜测是我从另一个问题得到了这个问题,没有完全意识到其含义.