ruby-on-rails session - 在Rails中的子域之間共享會話(cookie)?




4 Answers

當它變成“域:全部”時,會為該會話期間訪問的所有不同子域創建一個cookie(並確保它們在請求之間傳遞)。 如果未傳遞域參數,則表示將為在同一個會話中訪問的每個不同域創建一個新的cookie,並且舊Cookie將被丟棄。 我需要的是在整個會話期間持續存在的單個Cookie,即使域發生更改。 因此,通過domain: lvh.me解決了開發中的問題。 這會創建一個保存在不同子域之間的cookie。

對於需要進一步解釋的人來說,這是一個很好的鏈接: http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/ : http://excid3.com/blog/sharing-a-devise-user-session-across-subdomains-with-rails-3/

我有一個應用程序設置,其中每個用戶都屬於一家公司,並且該公司有一個子域(我正在使用basecamp樣式的子域)。 我面臨的問題是rails會創建多個cookie(一個用於lvh.me,另一個用於subdomain.lvh.me),這在我的應用程序中造成了很多中斷(例如,一直刷新所有請求的Flash消息登錄)。

我在/cofig/initilizers/session_store.rb文件中有這個:

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

域名::​​似乎都是我在Google上找到的標準答案,但這似乎不適合我。 任何幫助表示讚賞!




我一直在尋找一種方法來解決這個問題,而不必明確說明域名,所以我可以在localhost,lvh.me和我將在生產環境中使用的任何域之間跳轉,而無需繼續編輯session_store.rb文件。 然而,設置“域名:全部”似乎沒有為我工作。

最終,我發現我需要在該表達式中聲明tld_length(頂級域長度)。 例如,默認的tld_length為1,而example.lvh.me的tld_length為2,127.0.0.1.xip.io的tld_length為5。 所以我在開發中的lvh.me上的子域名session_store.rb文件中以及生產中的其他內容都在下面。

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

希望這可以幫助某人,因為花了很長時間才找到這個答案!




出於某種原因替換:all與域沒有工作(軌3.2.11)對我來說。 它需要一塊定制的中間件來修復它。 該解決方案的總結如下。

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.comothersub.yourdomain.comyourdomain.com

挑戰是在所有子域中使用相同的會話存儲文件。

第1步:添加自定義中間件類

這就是Rack Middleware進來的地方。一些相關的機架和導軌資源:

這是一個自定義類,您應該在lib添加這是由@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文件。

第2步:添加到Rails配置

現在你在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技巧映射到本地主機上。 這很棒。 有關子域本筆記的更多信息,請參閱Railscast

希望應該這樣做。 我真的不完全確定為什麼這個過程是這個錯綜複雜的,因為我覺得跨子網站是常見的。 如果有人對任何這些步驟背後的原因有進一步的了解,請在評論中提醒我們。




Rails 4.x (Rails 5版本也應該沒問題)

如何獲取lvh.me:3000和localhost中的子域(Rails)

簡單地說,我已經共享了cookies來將.lvh.me添加到session_store.rb

它將在本地主機admin.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



Related