Проигрышный сеанс в приложении rails 2.3.2 с использованием поддоменов - PullRequest
5 голосов
/ 19 марта 2009

У меня есть приложение 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_authentication и я также использую пассажир 2.1.2. Кто-нибудь может помочь?

Ответы [ 10 ]

7 голосов
/ 11 июня 2009

Ответ Олли правильный, в рельсах 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'

Edit: очевидно, проекты Rails 2.2.2 используют что-то другое. «домен» должен называться «session_domain» и выводить символ точки за пределы домена. Попробуйте это:

config.action_controller.session ||= {}
config.action_controller.session[:session_domain] = 'example.com'
3 голосов
/ 20 мая 2009

В Rails 2.3 вы должны использовать

config.action_controller.session[:domain] = '.example.com'
2 голосов
/ 25 апреля 2010

Более пуленепробиваемым решением было бы проверить, существует ли сессия уже или нет. Если вы слепо заменяете весь объект сеанса, это может сбить вас с толку в будущем.

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

Мне нравится делать это в файле инициализатора.

1 голос
/ 13 марта 2010

Я использую Rails 2.3.5 и

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

в моем файле development.rb, но у меня не получается?

Что еще нужно сделать?

1 голос
/ 14 декабря 2009

Я просто хотел упомянуть, что еще один способ обрабатывать файлы cookie для всего поддоменов - это динамически. Работает в 2.3.4.

Примерно так в окружающей среде. 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
1 голос
/ 26 марта 2009

Вы должны указать:

.example.com

(обратите внимание на начальную точку ), чтобы cookie-файл сеанса мог применяться к example.com , а также к его поддоменам .

0 голосов
/ 11 октября 2012

Может быть добавлено в то же место, где вы установили сеансовый ключ и секрет

config.action_controller.session = {
      :key => '_app_session',
      :domain => '.domain.com',
      :secret => 'secret'
}
0 голосов
/ 23 декабря 2010

Я также работаю с 2.3.5 и сталкиваюсь с проблемами, похожими на @ alfred-nerstu

Нет сообщений об ошибках с патчем от @schickm, но, похоже, он тоже не работает.

0 голосов
/ 21 апреля 2009

у нас была такая же проблема (проигрышные сессии, без поддоменов), с nginx + thin. Миграция на apache + passenger (последняя версия) устранила проблему.

0 голосов
/ 08 апреля 2009

У меня была такая же проблема с сеансами на основе файлов cookie. Обновление до версии 2.1.3, похоже, решило проблему.

...