Oturum (çerezler) Rails'te alt etki alanları arasında paylaşılsın mı?


93

Her kullanıcının bir şirkete ait olduğu ve bu şirketin bir alt etki alanına sahip olduğu bir uygulama kurulumum var (basecamp tarzı alt etki alanları kullanıyorum). Karşılaştığım sorun, rayların uygulamamda epeyce kesintiye neden olan birden fazla çerez oluşturmasıdır (biri lvh.me için ve diğeri subdomain.lvh.me için) giriş yapıldı).

/Cofig/initilizers/session_store.rb dosyamda bu var:

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

Etki alanı:: hepsi Google'da bulduğum standart cevap gibi görünüyor, ancak bu benim için işe yaramıyor gibi görünüyor. Herhangi bir yardım takdir edilmektedir!

Yanıtlar:


76

Görünüşe göre 'etki alanı: hepsi', o oturum sırasında ziyaret edilen tüm farklı alt etki alanları için bir çerez oluşturur (ve istek arasında aktarılmalarını sağlar). Etki alanı bağımsız değişkeni iletilmezse, aynı oturumda ziyaret edilen her farklı etki alanı için yeni bir çerez oluşturulduğu ve eskisinin atıldığı anlamına gelir. İhtiyacım olan şey, alan değiştiğinde bile oturum boyunca kalıcı olan tek bir çerezdi. Bu nedenle, geçmek domain: "lvh.me"gelişimdeki sorunu çözdü. Bu, farklı alt alanlar arasında orada kalan tek bir çerez oluşturur.

Daha fazla açıklamaya ihtiyaç duyan herkes için bu harika bir bağlantıdır: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/


2
Teşekkürler Dostum .. Projelerimden birinde bu sorunla karşı karşıyayım .. Sonunda çözümü buldum ..
Shirjeel Alam

3
Aynı şeyi config.secret_key_basetüm uygulamalarınızda kullandığınızdan emin olun , aksi takdirde çerezin kodunu çözemez.
Bruno Buccolo

6
Rails 4 için bununla ilgili herhangi bir soru görmüyorum. Bunun değişip değişmediğini biliyor musunuz? Projemle çalışmasını sağlayamıyorum. Çerezleri yeniden oluşturmaya devam ediyor. Teşekkürler.
Andy

CacheStoreMemcached'de oturumları saklamak için kullanmak istersem ne olur ?
Amit Patel

2
Rails4 ile bunun yalnızca kısa çizgiler içeren alt etki alanları için işe yaradığını ancak alt çizgilerle çalışmadığını buldum:Appname::Application.config.session_store :cookie_store, key: '_appname_session', domain: :all, tld_length: 2
user1515295

68

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

"Burada dikkat etmek istediğiniz kısım şudur: domain =>: tüm benzerleri bazı yerlerde tavsiye edilirse, localhost kullanmadığınız sürece çalışmayacaktır.: Tüm varsayılanlar 1 TLD uzunluğundadır. Bu, Pow (myapp.dev) ile test ediyorsanız, bu 2 uzunluğunda bir TLD olduğu için çalışmayacağı anlamına gelir.

Başka bir deyişle ihtiyacınız olan:

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

Çerezlerinizi temizlemek için de iyi bir fikir


1
Bu en iyi cevaptır çünkü tek değişiklik tüm ortamlarda çalışır (app.com ve app.dev). Özel ara yazılım gerekli değildir. Çerezleri temizlemek için de iyi bir nokta!
Turadg

1
Eğer eksik, :tld_length => 2
montrealmike

1
Aynı şeyi config.secret_key_basetüm uygulamalarınızda kullandığınızdan emin olun , aksi takdirde çerezin kodunu çözemez.
Bruno Buccolo

4
:domain => :allRails 4'te çalışmayacak, deneyin domain => 'lvh.me', tld_length = 2. Benim için çalışıyor
Minh

1
Rails 4.2 ile sadece domain: :all, tld_length: 2alan lvh.meadını kullanırken iyi sonuçlar aldım .
zwippie

24

Etki alanı adını açıkça belirtmek zorunda kalmadan bu sorunu çözmenin bir yolunu arıyordum, böylece localhost, lvh.me ve session_store.rb dosyasını düzenlemeye devam etmek zorunda kalmadan üretimde kullanacağım etki alanları arasında geçiş yapabiliyordum. Ancak, "domain:: all" ayarı benim için işe yaramıyor gibi görünüyordu.

Sonunda, bu ifadede tld_length (üst düzey alan uzunluğu) belirtmem gerektiğini buldum. Varsayılan tld_length 1 iken example.lvh.me'nin tld_length değeri 2'dir ve 127.0.0.1.xip.io'nun tld_length değeri 5'tir. Bu nedenle, lvh.me üzerinde alt etki alanları için session_store.rb dosyasında, geliştirme aşamasında ve üretimdeki diğer her şeyde sahip olduğum şey aşağıdaki gibiydi.

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

Bu cevabı bulmam uzun zaman aldığından, umarım bu birine yardımcı olur!


19

Bazı nedenlerden dolayı :allalan adıyla değiştirmek benim için işe yaramadı (raylar 3.2.11). Düzeltmek için özel bir Middleware gerekiyordu. Bu çözümün bir özeti aşağıdadır.

tl; dr: Özel bir Rack Middleware yazmanız gerekir. Onu conifg/environments/[production|development].rb. Bu Rails 3.2.11'de

Çerez oturumları genellikle yalnızca üst düzey alanınız için saklanır.

Eğer bakarsanız Chrome -> Settings -> Show advanced settings… -> Privacy/Content settings… -> All cookies and site data… -> Search {yourdomain.com}sizin için ayrı girişleri olacağını görebilirsiniz sub1.yourdomain.comve othersub.yourdomain.comveyourdomain.com

Buradaki zorluk, tüm alt alan adlarında aynı oturum saklama dosyasını kullanmaktır.

Adım 1: Özel Ara Yazılım Sınıfı Ekleyin

Rack Middleware burada devreye girer. Bazı ilgili raf ve ray kaynakları:

İşte eklemeniz gereken özel bir sınıf lib Bu @Nader tarafından yazılmıştır ve hepiniz ona teşekkür etmelisiniz.

# 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

Temel olarak bunun yaptığı şey, tüm çerez oturum verilerinizi kök etki alanınıza eşit olan aynı çerez dosyasına geri eşlemesidir.

Adım 2: Rails Yapılandırmasına Ekle

Artık lib'de özel bir sınıfınız olduğuna göre, onu otomatik olarak yüklediğinizden emin olun. Bunun sizin için hiçbir anlamı yoksa, buraya bakın: Rails 3 otomatik yükleme

İlk şey, bir çerez deposu kullanarak sistem genelinde olduğunuzdan emin olmaktır. İçinde config/application.rbRails'e bir çerez deposu kullanmasını söylüyoruz.

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

Bunun burada belirtilmesinin nedeni :domain => :allsatırdan kaynaklanmaktadır. :domain => ".yourdomain.com"Bunun yerine belirtmeyi öneren başka insanlar var :domain => :all. Bazı nedenlerden dolayı bu benim için işe yaramadı ve yukarıda açıklandığı gibi özel Middleware sınıfına ihtiyacım vardı.

Sonra config/environments/production.rbeklediğinizde:

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

Önceki noktanın gerekli olduğuna dikkat edin. "Bkz Bir üst etki alanı isteği? Gönderilen alt alan çerezleri, niçin".

Sonra config/environments/development.rbeklediğinizde:

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

Lvh.me hilesi localhost ile eşleşir. Bu harika. Alt alan adları hakkındaki bu Railscast'e ve daha fazla bilgi için bu nota bakın.

Umarım bunu yapmalıdır. Dürüst olmak gerekirse, çapraz alt alan sitelerinin yaygın olduğunu düşündüğüm için sürecin neden bu kadar karmaşık olduğundan tam olarak emin değilim. Bu adımların her birinin ardındaki nedenlerle ilgili daha fazla bilgi sahibi olan varsa, lütfen yorumlarda bizi aydınlatın.


Bunun birden çok üst düzey alanla çalışmasını sağlamanın bir yolu var mı? Farklı ülkelerde çalışan bir ürünüm var. Burada varsayılan etki alanının alaniniz.com olduğunu varsayıyoruz, ancak ya .be .sv .fr .com.br .com.ar ve diğerleri için çalışması gerekiyorsa? Teşekkürler.
Marc Lainez

Bunu çalıştıramıyorum. Raylar 4'te geliştiriyorum ve görünüşe göre rialler yukarıdaki tüm kodu nazikçe görmezden geliyor. Sadece oturumu alt alanlar arasında paylaşmak istemiyor.
Ole Henrik Skogstrøm

@ OleHenrikSkogstrøm config.secret_key_baseTüm uygulamalarınızda aynısını kullandığınızdan emin olun , aksi takdirde çerezin kodunu çözemez.
Bruno Buccolo

17

Çerezi kök etki alanı olarak ayarlamanın en basit yolunu ararken bununla karşılaştım. :allEtki alanı seçeneği olarak geçildiğinde seçenek hakkında bazı yanlış bilgiler var gibi görünüyor . Çoğu etki alanı için, çerezi kök etki alanına (örneğin .example.comiçin test.example.com) ayarlayarak aslında beklendiği gibi çalışacaktır . Sanırım çoğu insan lvh.me, test etmek için alanı kullandıkları için sorunlar yaşadı . Raylar tarafından bir üst düzey alan bulmak için kullanılan normal ifade olarak tanımlanır DOMAIN_REGEXP = /[^.]*\.([^.]*|..\...|...\...)$/. Son kısmı not ederseniz, lvh.merails'in benzer bir TLD olarak yorumladığını görebilirsiniz com.au. Kullanım alanınızın lvh.meçalışması gerekiyorsa , bu :allseçenek düzgün çalışmayacaktır, ancak çoğu alan için en basit ve en iyi seçenek gibi görünmektedir.

TL; DR, buradaki doğru cevap, 3 harfli bir alan adı (veya yukarıdaki normal ifadeyi karıştıran herhangi bir alan adı) üzerinde geliştirme yapmadığınızı varsayarak kullanmaktır :all.


Teşekkürler, bu nihayet neden bu kadar çok cevabın tld_length'in 2 olduğunu ama neden buna ihtiyacım olmadığını anlamama yardımcı oldu!
çorba köpeği

Bu cevabın daha yüksek olması gerekiyor. Teşekkürler efendim.
luca.busin

"lvh.me com.au'ya benzer bir TLD olarak" BTW Rails gerçekten .me'yi bir ülke etki alanı (Karadağ) ile aynı şekilde yorumlamalıdır.
mahemoff

8

Rails 4.x (ayrıca Rails 5/6 sürümlerinde de uygun olmalıdır)

Localhost'ta lvh.me:3000 ve alt alan adı nasıl edinilir (Rails)

Geliştirme: Ben ekleyerek için çerezler paylaştı .lvh.meiçine session_store.rb,

Bu localhost üzerinde alt alanlar arasında paylaşılacak admin.lvh.me:3000, lvh.me:3000vb ...

#config/initializers/session_store.rb

domain = Rails.env.production? ? ".domain_name.com" : ".lvh.me"

Rails.application.config.session_store :cookie_store, 
                      key: '_app_name_session', domain: domain

4

Denedin mi

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

)

temel olarak, temel etki alanı için tek çerezimiz olduğunu ve alt etki alanını göz ardı edeceğimizi söylüyoruz ... Ancak bu yaklaşımın hala bazı kusurları var ...


2

destek rayları5

herhangi bir alan adı ile çalışmasını istiyorsanız:

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

Her ortama göre yapılandırmak için aşağıdakileri kullanabilirsiniz:

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

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


0

Redis'i oturum deposu için kullanıyorsanız.

if Rails.env.development?
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: 'localhost', port: 6379},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: :all
    }

else
    Rails.application.config.session_store :redis_store, {
       servers: [
        { host: HOST_URL, port: PORT},
      ],
      key: '_app_session',
      expire_after: 1.day,
      domain: '.domain.com',
      tld_length: 2
    }
    
end 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.