使用子域丢失rails 2.3.2 app中的会话

时间:2009-03-19 20:19:40

标签: ruby-on-rails session restful-authentication

我有一个2.2.3应用程序,我升级到2.3.2

这是一个多站点(使用子域),可为所有站点创建一个顶级会话。

这就是我在production.rb中更改域名的方式:

ActionController::Base.session_options[:domain] = "example.com"

# in rails 2.2.2, this is what i used to do:
# ActionController::Base.session_options[:session_domain] = "example.com" 

升级后,奇怪的事情开始发生了 我无法再使用restful身份验证登录;它确实验证了我,但是一旦我被重定向,就会要求我再次登录。

正如我所说,我使用restful_authentication,我也使用乘客2.1.2。 有人可以帮忙吗?

10 个答案:

答案 0 :(得分:7)

Olly的回答是正确的,在rails 2.3中它应该是:

config.action_controller.session[:domain] = '.example.com'

我只想补充一点,如果你还没有创建一些会话选项,你可能会在使用它时收到:

undefined method `[]=' for nil:NilClass

在这种情况下,您应该使用它(它创建会话变量而不是更新它):

config.action_controller.session ||= {}
config.action_controller.session[:domain] = '.example.com'

编辑:显然Rails 2.2.2项目使用不同的东西。 “domain”应命名为“session_domain”,并将句点字符放在域前面。试试这个:

config.action_controller.session ||= {}
config.action_controller.session[:session_domain] = 'example.com'

答案 1 :(得分:3)

在Rails 2.3中你应该使用

config.action_controller.session[:domain] = '.example.com'

答案 2 :(得分:2)

更加防弹的解决方案是检查会话是否已存在。如果你盲目地替换整个会话对象,它可能会在将来绊倒你。

if ActionController::Base.session
  ActionController::Base.session[:domain] = '.example.com'
else
  ActionController::Base.session = { :domain => '.example.com' }
end

我喜欢在初始化文件中执行此操作。

答案 3 :(得分:1)

您必须注明:

.example.com

(请注意前导点),以便会话Cookie 适用于example.com 及其子域

答案 4 :(得分:1)

只是想提一下处理cookie的整个子域事物的另一种方法是动态的。适用于2.3.4。

environment.rb中的类似内容

# solution to use the cookies in the api. domains
# this is relevant but in 2.3.4 the code is different
# http://szeryf.wordpress.com/2008/01/21/cookie-handling-in-multi-domain-applications-in-ruby-on-rails/
# Just making sure that api. shares the domain name
require 'dispatcher'
module ActionController
  class Dispatcher
    def set_session_domain
      host_name = @env['SERVER_NAME']
      new_host_name = whatever #some mod of the host_name, for instance
      ActionController::Base.session = {
        :domain => new_host_name
      }
    end

    before_dispatch :set_session_domain
  end
end

答案 5 :(得分:1)

我正在运行Rails 2.3.5并且

config.action_controller.session = {:domain => '.localhost:3000'}

在我的development.rb中,但是我没有让它工作?

你需要做的其他事情吗?

答案 6 :(得分:0)

我们遇到了同样的问题(丢失会话,没有子域名),nginx + thin。迁移到apache + passenger(最新版本)修复了问题。

答案 7 :(得分:0)

我也在运行2.3.5并遇到类似问题@ alfred-nerstu

没有来自@schickm的补丁的错误消息,但似乎也没有。

答案 8 :(得分:0)

可以将其添加到您设置会话密钥和密码

的相同位置
config.action_controller.session = {
      :key => '_app_session',
      :domain => '.domain.com',
      :secret => 'secret'
}

答案 9 :(得分:-1)

基于cookie的会话我遇到了同样的问题。升级到Passenger 2.1.3似乎解决了这个问题。