рельсы 3 сеанса по поддоменам не работает в Internet Explorer - PullRequest
6 голосов
/ 26 июля 2011

Я работаю над приложением rails 3, которое использует субдомены. Я использовал railscasts # 221 «Субдомены в рельсах 3» (http://railscasts.com/episodes/221-subdomains-in-rails-3) в качестве руководства, и все идет хорошо, кроме как в Explorer.

Чтобы сохранить мой сеанс во всех поддоменах, я поместил следующую строку в файл session_store.rb, как сказано в руководстве:

MyApp.application.config.session_store :cookie_store, :key => '_myapp_session', :domain => "example.com"

Я протестировал свое приложение на Firefox и Chrome, и оно хорошо работает, но по какой-то причине вообще не работает в Internet Explorer. Поведение странное, потому что иногда кажется, что сеанс является общим для всех моих поддоменов, но в некоторых других есть поддомены, в которые я вошел, и другие поддомены, в которых я не вошел.

Я не могу найти причину для этого, и я был бы признателен за любую идею ...

Я использую Devise для аутентификации с помощью rails 3.0.5

Ответы [ 2 ]

6 голосов
/ 26 июля 2011

Полагаю, вам нужно изменить значение domain на .example.com (начальная точка указывает, что файл cookie может использоваться в поддоменах):

MyApp.application.config.session_store :cookie_store, :key => '_myapp_session', :domain => ".example.com"
4 голосов
/ 07 февраля 2013

По какой-то причине это не сработало (rails 3.2.11) для любых данных сеанса, которые были установлены на поддомене. Для исправления потребовался кусок пользовательского Middleware. Краткое описание этого решения приведено ниже.

tl; dr: Вам необходимо написать специальное промежуточное программное обеспечение для стойки. Вы должны добавить его в свой conifg/environments/[production|development].rb. Это на Rails 3.2.11

Сеансы cookie обычно хранятся только для вашего домена верхнего уровня.

Если вы посмотрите на Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com} Вы увидите, что для sub1.yourdomain.com и othersub.yourdomain.com и yourdomain.com

будут отдельные записи

Задача состоит в том, чтобы использовать один и тот же файл хранилища сеансов во всех поддоменах.

Шаг 1. Добавление пользовательского класса промежуточного программного обеспечения

Здесь промежуточное программное обеспечение стойки . Некоторые соответствующие ресурсы стойки и рельсов:

Вот пользовательский класс, который вы должны добавить в lib Это написал @ Надер и вы все должны поблагодарить его

# Custom Domain Cookie
#
# Set the cookie domain to the custom domain if it's present
class CustomDomainCookie
  def initialize(app, default_domain)
    @app = app
    @default_domain = default_domain
  end

  def call(env)
    host = env["HTTP_HOST"].split(':').first
    env["rack.session.options"][:domain] = custom_domain?(host) ? ".#{host}" : "#{@default_domain}"
    @app.call(env)
  end

  def custom_domain?(host)
    host !~ /#{@default_domain.sub(/^\./, '')}/i
  end
end

По сути, это означает, что он отобразит все ваши данные сеанса cookie обратно в тот же файл cookie, который равен вашему корневому домену.

Шаг 2: Добавить в Rails Config

Теперь, когда у вас есть собственный класс в lib, убедитесь, что он загружается автоматически. Если это ничего не значит для вас, посмотрите здесь: Rails 3 autoload

Прежде всего, убедитесь, что вы используете систему cookie-файлов для всей системы. В config/application.rb мы говорим Rails использовать хранилище cookie.

# We use a cookie_store for session data
config.session_store :cookie_store,
                     :key => '_yourappsession',
                     :domain => :all

Причина, по которой это здесь упоминается, заключается в строке :domain => :all. Есть другие люди, которые предложили указать :domain => ".yourdomain.com" вместо :domain => :all. По какой-то причине это не сработало, и мне потребовался специальный класс Middleware, как описано выше.

Тогда в вашем config/environments/production.rb добавьте:

config.middleware.use "CustomDomainCookie", ".yourdomain.com"

Обратите внимание, что предыдущая точка необходима. См. " куки субдомена, отправленные в запросе родительского домена? ", почему.

Тогда в вашем config/environments/development.rb добавьте:

config.middleware.use "CustomDomainCookie", ".lvh.me"

Трюк lvh.me отображается на localhost. Это круто См. этот Railscast о поддоменах и в этой заметке для получения дополнительной информации.

Надеюсь, это должно сделать это. Я, честно говоря, не совсем уверен, почему этот процесс настолько запутанный, так как я считаю, что сайты с поддоменами являются общими. Если у кого-либо есть какие-либо дополнительные сведения о причинах каждого из этих шагов, просим сообщить нам об этом в комментариях.

...