Проигрышный сеанс в приложении rails 2.3.2 с использованием поддоменов

У меня есть приложение 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 ответов

Ответ Олли правильный, в рельсах 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 используют что-то другое. "домен" должен называться "session_domain" и убирать символ точки с передней части домена. Попробуй это:

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

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

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

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

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

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

Я бегу Rails 2.3.5 и имею

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

в моем development.rb, но я не получаю его на работу?

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

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

.example.com

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

Я просто хотел упомянуть, что еще один способ обрабатывать файлы 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

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

config.action_controller.session = {
      :key => '_app_session',
      :domain => '.domain.com',
      :secret => 'secret'
}

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

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

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

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

Другие вопросы по тегам