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_base在secret.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]值为零.怎么了,怎么解决这个问题?
嗯,由你的更新触发,这只发生在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保护.
有关此类问题的更多背景阅读,请参阅:
那听起来像你的问题吗?
| 归档时间: |
|
| 查看次数: |
1962 次 |
| 最近记录: |