Что делает Rails 3 session store domain: все действительно делают?


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

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

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

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

какова правильная настройка домена session_store, чтобы я мог: a) совместное использование сеансов во всех доменах моего основного домена, например "mydomain.com" b) пользователи, которые получают доступ к своему личному поддомену, например "user1.mydomain.com" через пользовательский url CNAME, например "some.otherdomain.com" все еще можно создавать отдельные сеансы.

спасибо

5 53

5 ответов:

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

# 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, значение, домен и путь.

: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

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

tl; dr: использовать @Nader's код. Но я обнаружил, что мне нужно добавить его в мой conifg/environments/[production|development].rb и Передайте мой dot-prefixed-домен в качестве аргумента. Это на рельсах 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 ' s CustomDomainCookie код

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

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

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

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

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

# 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 о поддоменах и эта заметка для получения дополнительной информации.

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

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

Хммм,

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

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

Ян Виллем