gpt4 book ai didi

ruby-on-rails - session 不会在 Rails 4 中持续

转载 作者:数据小太阳 更新时间:2023-10-29 07:49:47 26 4
gpt4 key购买 nike

更新:

我确定我可以在其他操作中更改 session ,但是如果我在 POST 请求中设置 session ,它不会持续。如果我将操作从 POST 更改为 GET,则 session 会继续存在。

原始问题:

我有一个 Rails 4.2.0.rc3 应用程序。每当用户登录时, session 都会分配给该用户的 ID。但是,当我运行 current_user 方法时, session 不会持续。我在 secret.yml 文件中有一个 secret_key_base。这是我的 session 助手。

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

在我的日志文件中,我看到 session[:id] 已设置。当运行另一个操作并调用 current_user 方法时,session[:id] 为 nil。出了什么问题,我该如何解决?

最佳答案

嗯,你的更新触发了这只发生在 POST 上,我记不太清了几件事。

  • Rails 有 CSRF 保护,但默认情况下它只应用于 POST,而不应用于 GET

  • 在 CSRF 失败的情况下,默认的 Rails CSRF 保护逻辑将静默使用新 session ,而不是引发。 (我个人认为这是一个糟糕的默认选择)。

我想知道这是不是正在发生的事情。

要找到答案,您需要告诉您的 Rails 应用程序实际引发异常以在 CSRF 失败时大声失败,而不是默默地使用新的孤立 session 。

在您的 app/controllers/application_controller.rb 中,查找行 protect_from_forgery,然后更改为 protect_from_forgery with: :exception,以告诉 Rails 在 CSRF 失败时实际引发。 (实际上,看起来 Rails 4.x 应用程序现在是用这个新版本的行生成的,但是如果你有一个应用程序是从 3.x 升级的,它就不会了。为 railsdiff for making it easy to investigate 变化万岁在 rails new 跨 rails 版本生成的代码中)。

如果您在演示测试用例中遇到异常,那么知道问题出在哪里,您就可以找到合适的解决方案:要么让 POST 请求具有适当的 CSRF 保护,要么关闭该操作的 CSRF 保护。如果是 API 类型的请求,您可能不需要 CSRF 保护。

有关此类问题的更多背景阅读,请参阅:

这些听起来像你的问题吗?

关于ruby-on-rails - session 不会在 Rails 4 中持续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27512278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com