Что делает 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 ответов:
ОК, способ сделать это-установить домен на сеансе 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 приходит. Некоторые более соответствующие стойки и направляющие ресурсы:
- Railscasts о стойку
- направляющая для стойки
- шкаф для документации sesssions отвлеченно и сеансы cookie
в основном то, что это означает, что он будет отображать все ваши данные сеанса 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. Если нет, то мы можем указать доменное имя вместо этого, и это будет использоваться в качестве базового домена для сеанса.