会话在应用程序控制器中变为零

时间:2016-03-29 20:36:22

标签: ruby-on-rails session

在我们的Rails 4.2应用程序中,模块应用程序控制器中的方法view_handler正在获取带有nil变量的session。这是代码结构:

class my_module < ApplicationController
  def view_handler
    #access session[:page_step] which is defined in controller.
  end
end 

默认Cookie存储用于会话:

Rails.application.config.session_store :cookie_store, key: '_my_app_session'

我们确认这不是scope问题,因为当view_handler移入主应用application controller时,问题仍然存在。

在使用application controller进行调试时,session对象存在但nil值为:

>session.present? #false
>session.nil? #true
>session[:page_step] #nil

这是调试中的session对象。保存应用程序定义的会话变量的@delegate为空:

enter image description here

同样在调试中,session[:page_step]controller动作后期再次重新浮出水面。不知何故,session[:page_step](以及其他会话变量)在nil中变为application controller并在controller中重新浮出水面。由于默认session variables application controller RAILS位于application controllernone会导致它们在loop中变为零?

1 个答案:

答案 0 :(得分:2)

您可能遇到CSRF Issue

  

如果安全令牌与预期不符,则会话将重置

要检查它是否是CSRF问题,您可以暂时禁用ApplicationController中的protect_from_forgery

此外,请确保Session Storage的配置已完成,config/secrets.yml中的密钥用于非生产环境,并作为生产环境变量。

可以在控制台中使用以下命令生成密钥:

$ rake secret
82d58d3dfb91238b495a311eb8539edf5064784f1d58994679db8363ec241c745bef0b446bfe44d66cbf91a2f4e497d8f6b1ef1656e3f405b0d263a9617ac75e

每次使用新密钥时,使用其他密钥的旧会话将无法验证,会话结果将为零。

直接来自生成的文件config/secrets.yml的评论(Rails 4.2):

# Be sure to restart your server when you modify this file.

# Your secret key is used for verifying the integrity of signed cookies.
# If you change this key, all old signed cookies will become invalid!

# Make sure the secret is at least 30 characters and all random,
# no regular words or you'll be exposed to dictionary attacks.
# You can use `rake secret` to generate a secure secret key.

# Make sure the secrets in this file are kept private
# if you're sharing your code publicly.