Поделиться сессией (куки) между поддоменами в Rails?

У меня есть настройка приложения, где каждый пользователь принадлежит компании, и у этой компании есть поддомен (я использую поддомен в стиле basecamp). Проблема, с которой я сталкиваюсь, заключается в том, что rails создает несколько файлов cookie (один для lvh.me, а другой для subdomain.lvh.me), что вызывает довольно много перерывов в работе моего приложения (например, постоянные флеш-сообщения, хотя и все запросы выполняются один раз) Вошел).

У меня есть это в моем файле /cofig/initilizers/session_store.rb:

<code>AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: :all
</code>

Кажется, стандартный домен:: all - это стандартный ответ, который я нашел в Google, но, похоже, он мне не подходит. Любая помощь приветствуется!

Ответы на вопрос(8)

AppName::Application.config.session_store :cookie_store, key: '_application_devise_session', domain: 'lvh.me'  

)

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

если вы хотите, это работает с любым доменом:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: :all, tld_length: 2

Для настройки для каждой среды вы можете использовать следующее:

Rails.application.config.session_store :cookie_store, key: '_my_app_session', domain: {
  production: '.example.com',
  development: '.example.dev'
}.fetch(Rails.env.to_sym, :all)

Ref:https://github.com/plataformatec/devise/wiki/How-To:-Use-subdomains

Rails 4.x (также должно быть хорошо с версией Rails 5)

Как получить lvh.me:3000 и поддомен в localhost (Rails)

Просто я поделился куки для добавления.lvh.me вsession_store.rb,

Он будет разделен между поддоменами на localhostadmin.lvh.me:3000, lvh.me:3000 и так далее...

#config/initializers/session_store.rb

if Rails.env.production?
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: ".domain_name.com"
else
    Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: '.lvh.me'
end

http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

"The part you want to watch out for here is that if you set :domain => :all like is recommend in some places, it simply won’t work unless you’re using localhost. :all defaults to a TLD length of 1, which means if you’re testing with Pow (myapp.dev) it won’t work either because that is a TLD of length 2."

Другими словами вам нужно:

 App.config.session_store ... , :domain => :all, :tld_length => 2

Также хорошая идея, чтобы очистить ваши куки

 01 окт. 2014 г., 14:25
:domain => :all не будет работать в Rails 4, попробуйтеdomain => 'lvh.me', tld_length = 2, У меня получилось
 15 янв. 2014 г., 02:51
вам не хватает, :tld_length => 2
 01 мар. 2015 г., 02:11
С Rails 4.2 я получил хорошие результаты только сdomain: :all, tld_length: 2 при использованииlvh.me домен.
 22 апр. 2013 г., 16:14
Это лучший ответ, потому что одно изменение работает во всех средах (app.com и app.dev). Пользовательское промежуточное программное обеспечение не требуется. Также хороший момент, чтобы очистить куки!
 26 мая 2014 г., 21:03
Обязательно используйте тот жеconfig.secret_key_base во всех ваших приложениях, иначе он не сможет расшифровать cookie.

когда искал самый простой способ установить cookie в качестве корневого домена. Кажется, есть некоторая дезинформация о:all опция при передаче в качестве опции домена. Для большинства доменов он действительно будет работать как положено, установив cookie в корневой домен (например,.example.com заtest.example.com). Я думаю, что у большинства людей возникли проблемы, поскольку они используют доменlvh.me тестировать. Регулярное выражение, используемое rails для поиска домена верхнего уровня, определяется какDOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/, Если вы заметите последнюю часть, вы можете увидеть, что рельсы интерпретируетlvh.me как TLD, похожий наcom.au, Если вам нужен вариант использованияlvh.me работать, то:all Параметр не будет работать должным образом, однако он представляется наиболее простым и лучшим вариантом для большинства доменов.

TL; DR, правильный ответ здесь, при условии, что вы не разрабатываете трехбуквенный домен (или любой домен, который смущает приведенное выше регулярное выражение), это использовать:all.

 15 дек. 2013 г., 12:55
+1 Хорошее объяснение, спасибо.
 15 мар. 2017 г., 23:30
Спасибо, это, наконец, помогло мне понять, почему так много ответов рекомендуют tld_length 2, но почему мне это не нужно!
 10 янв. 2018 г., 00:47
Этот ответ должен быть выше. Спасибо, сэр.

менное имя, поэтому я мог переключаться между localhost, lvh.me и любыми доменами, которые я использовал бы в рабочей среде, без необходимости редактировать файл session_store.rb. Тем не менее, настройка & quot; домен:: все & quot; похоже, не работает для меня.

В конечном итоге я обнаружил, что мне нужно указать в этом выражении tld_length (длина домена верхнего уровня). Значение по умолчанию tld_length равно 1, а example.lvh.me имеет значение tld_length 2, а 127.0.0.1.xip.io имеет значение tld_length 5, например. Итак, то, что я имел в файле session_store.rb для поддоменов на lvh.me в процессе разработки и всего остального в производстве, было ниже.

MyApp::Application.config.session_store :cookie_store, key: '_MyApp_session', domain: :all, tld_length: 2

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

 11 июл. 2016 г., 23:06
Это помогло, спасибо!
Решение Вопроса

все » создает cookie для всех различных поддоменов, которые посещаются во время этого сеанса (и обеспечивает их передачу между запросами). Если аргумент домена не передан, это означает, что новый файл cookie создается для каждого отдельного домена, который посещается в одном сеансе, а старый удаляется. Что мне было нужно, так это один файл cookie, который сохраняется в течение всего сеанса даже при изменении домена. Следовательно, проходяdomain: "lvh.me" решил проблему в разработке. Это создает один файл cookie, который остается между разными поддоменами.

Для тех, кто нуждается в дополнительном объяснении, это отличная ссылка: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

 07 мар. 2016 г., 13:01
Что делать, если я хочу использоватьCacheStore хранить сессии в memcached?
 02 сент. 2016 г., 05:23
С Rails4 я обнаружил, что это работает только для поддоменов с тире, но не с подчеркиванием:Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
 26 мая 2014 г., 21:02
Обязательно используйте тот жеconfig.secret_key_base во всех ваших приложениях, иначе он не сможет расшифровать cookie.
 01 мая 2012 г., 21:56
Спасибо, чувак. Я столкнулся с этой проблемой в одном из моих проектов ... Наконец-то нашел решение ...
 23 июл. 2014 г., 16:15
Я не вижу никаких вопросов, связанных с этим для Rails 4. Знаете ли вы, изменилось ли это. Я не могу заставить его работать с моим проектом. Он продолжает воссоздавать печенье. Благодарю.

:all с доменом у меня не работал (рельсы 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

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

Step 1: Add Custom Middleware Class

Это гдеСтойка Middleware входит. Некоторые соответствующие стойки & amp; ресурсы рельсов:

Railscasts about Rack Railsguide for Rack Rack documentation for sesssions abstractly and for cookie sessions

Вот пользовательский класс, который вы должны добавить вlib This was written by @Nader и вы все должны поблагодарить его

# 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, который равен вашему корневому домену.

Step 2: Add To Rails Config

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

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

# 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"

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

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

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

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

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

 26 мая 2014 г., 21:04
@ OleHenrikSkogstr & # xF8; m Обязательно используйте тот жеconfig.secret_key_base во всех ваших приложениях, иначе он не сможет расшифровать cookie.
 06 сент. 2013 г., 08:17
Есть ли способ заставить это работать с несколькими доменами верхнего уровня? У меня есть продукт, который работает в разных странах. Здесь мы предполагаем, что доменом по умолчанию является yourdomain.com, но что, если он должен был работать для .be .sv .fr .com.br .com.ar и других? Благодарю.
 03 окт. 2013 г., 20:18
Я просто не могу заставить это работать. Я занимаюсь разработкой в rails 4, и кажется, что rials просто осторожно игнорирует весь код выше. Он просто не хочет делить сеанс между поддоменами.

Ваш ответ на вопрос