Что делает домен Rails 3 session_store: все реально делают? - PullRequest
55 голосов
/ 30 октября 2010

Обновлен вопрос, чтобы сделать его более понятным

Я понимаю, что вы можете настроить домен вашего session_store для совместного использования сеансов между поддоменами, например: Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => "mydomain.com"

в Rails 3 что делает настройка :domain => :all?Он не может позволить вам делиться сессиями между доменами верхнего уровня, куки не могут этого сделать.В документации говорится, что предполагается один домен верхнего уровня.Так что же произойдет, если к вашему приложению будут подключаться несколько доменов?

В моем приложении мои пользователи могут создавать личные субдомены одного основного домена, но затем могут также получать доступ к этому субдомену через свой собственный домен.

Что такое правильная настройка домена session_store, чтобы я мог: а) делиться сессиями по всем доменам моего основного домена, например, «mydomain.com»; б) пользователям, которые получают доступ к своему личному поддомену, например, «user1.mydomain.com» через пользовательский CNAMEURL, например "some.otherdomain.com", может создавать отдельные сеансы.

Спасибо

Ответы [ 5 ]

31 голосов
/ 01 ноября 2010

ОК, способ сделать это - динамически установить домен в файле cookie сеанса.Чтобы сделать это достаточно рано, это должно быть сделано как промежуточное программное обеспечение стойки:

# 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
19 голосов
/ 11 марта 2015

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

Когда клиент (браузер) заходит на сайт, сайт сообщает клиентуустановить печенье.Когда это происходит, он указывает имя файла cookie, его значение, домен и путь.

:domain => :all указывает Rails поставить точку перед доменом cookie (то есть на любом хосте вашего браузера), так что cookie применяется ко всем поддоменам.

Вот соответствующий код из Rails 4.1 (actionpack/lib/action_dispatch/middleware/cookies.rb):

  def handle_options(options) #:nodoc:
    options[:path] ||= "/"

    if options[:domain] == :all
      # if there is a provided tld length then we use it otherwise default domain regexp
      domain_regexp = options[:tld_length] ? /([^.]+\.?){#{options[:tld_length]}}$/ : DOMAIN_REGEXP

      # if host is not ip and matches domain regexp
      # (ip confirms to domain regexp so we explicitly check for ip)
      options[:domain] = if (@host !~ /^[\d.]+$/) && (@host =~ domain_regexp)
        ".#{$&}"
      end
    elsif options[:domain].is_a? Array
      # if host matches one of the supplied domains without a dot in front of it
      options[:domain] = options[:domain].find {|domain| @host.include? domain.sub(/^\./, '') }
    end
  end

Я вижу, выуже ответил на вторую часть вашего вопроса о том, чтобы разрешить отдельным доменам проводить отдельные сеансы.

12 голосов
/ 07 февраля 2013

tl; dr: Используйте код @ Nader . НО я обнаружил, что мне нужно добавить его в мой 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: Используйте @ Nader CustomDomainCookie код

Здесь Rack Middleware входит. Некоторые более подходящие ресурсы стойки и рельсов:

По сути, это означает, что он отобразит все данные сеанса 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"

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

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

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

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

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

10 голосов
/ 31 октября 2010

Этот параметр используется для того, чтобы приложение могло обмениваться сеансами между поддоменами.Опция: all предполагает, что у нашего приложения размер домена верхнего уровня равен 1. Если нет, то мы можем указать вместо этого имя домена, которое будет использоваться в качестве базового домена для сеанса.

1 голос
/ 20 апреля 2011

Хм,

Я развертываю приложение, размещенное на сайте www.xyz.com и на xyz.com.

Для меня: domain =>: all устанавливает домен для cookie-файла сессии в xyz.com. Так что не для домена верхнего уровня, а на 1 уровень выше tld.

Ян Виллем

...