Ruby on rails 在Rails 4.0.0中调用“reset_session”在随后的第二页上不起作用
我一直在Rails 4.0.0中构建一些东西,我发现了一些奇怪的会话行为。我有一个将值写入会话的登录进程。它的缺失是我确定用户未登录的方式:Ruby on rails 在Rails 4.0.0中调用“reset_session”在随后的第二页上不起作用,ruby-on-rails,ruby,session,ruby-on-rails-4,Ruby On Rails,Ruby,Session,Ruby On Rails 4,我一直在Rails 4.0.0中构建一些东西,我发现了一些奇怪的会话行为。我有一个将值写入会话的登录进程。它的缺失是我确定用户未登录的方式: def login session[:user_id] = user.id #Then we render a simple page... end 为了验证我是否有有效的用户,我在我的应用程序\u controller.rb中有一个助手: def current_user logger.info "(current_user) Sess
def login
session[:user_id] = user.id
#Then we render a simple page...
end
为了验证我是否有有效的用户,我在我的应用程序\u 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
# 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']
这是从几个不同的地方调用的,用于检查用户状态并决定如何呈现页面。(下面解释了!=-1
)注销时,我重置会话:
def logout
reset_session
end
呈现的视图包括调用当前用户
助手方法来呈现导航。呈现此页面时,我的导航部分显示为没有当前用户,调试日志显示会话变量为已清除。但是,无论我做什么,在下一页它都会恢复到登录状态,我突然让用户再次进行身份验证,这样当前用户就可以从会话中获得正确的值
我尝试给会话分配一个不同的值(例如-1),这也有相同的影响。由于某些原因,我的会话在被删除后被恢复。此外,当我使用以下内容时:
def logout
reset_session
redirect_to root_path
end
此时将显示一个已登录用户的索引页。这真是令人讨厌。我很感激我可以使用Desive等,但这确实是关于奇怪的会话行为
我尝试过的事情:
- 尝试使用
rake tmp:sessions:clear
没有效果
- 用其他内容覆盖会话值
- 检查_my_key cookie值(该值永远不会更改???)-尽管我在响应头中返回的设置值具有不同的值。。。?这似乎有点奇怪
- 涡轮连杆已拆下
- 使用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)
您可以看到标记为(当前用户)
的两行代码,它们都是对my helper方法的调用(如上所述)。我使用OmniAuth从Google OAuth获取用户数据,但这并不特别重要。(哎呀…)该死的。我试图使此应用程序成为多租户,并且在我的会话\u store.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
# 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']
显然,这是不好的,并导致各种疯狂的事情发生在你的饼干和会议。线索应该在\u my_key
中,我认为这是非标准的?我猜我是从另一个SO问题得到的,没有完全意识到其中的含义 你能解释一下到底是什么问题吗?你的session\u store.rb现在看起来怎么样?我不得不删除启动Rails.application的那行代码。。。这导致Rails将其cookie写入另一个键下。然后,当我将cookie重置为注销时,它失败了。删除此行将恢复为默认行为并修复问题。