Проигрышный сеанс в приложении 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, похоже, решило проблему.