web-dev-qa-db-ja.com

Rails 3 session_store domain:all really do?

より明確にするために質問を更新

次のようにサブドメイン間でセッションを共有するようにsession_storeのドメインを設定できることを理解しています:Rails.application.config.session_store :cookie_store, :key => '_my_key', :domain => "mydomain.com"

in Rails 3、設定:domain => :all 行う?最上位ドメイン間でセッションを共有することはできません。Cookieはできません。ドキュメントでは、1つのトップレベルドメインを想定しています。複数のドメインがアプリにアクセスするとどうなりますか?

私のアプリでは、ユーザーは1つのメインドメインの個人用サブドメインを作成できますが、独自のカスタムドメインを介してそのサブドメインにアクセスすることもできます。

A)プライマリドメインのすべてのドメイン(「mydomain.com」など)でセッションを共有するb)CNAMEカスタムを介して個人のサブドメイン(「user1.mydomain.com」など)にアクセスするユーザー「some.otherdomain.com」のようなURLでも、別のセッションを作成できます。

ありがとう

56
Nader

OK、これを実現する方法は、セッションCookieにドメインを動的に設定することです。これを十分に早く行うには、ラックミドルウェアとして実行する必要があります。

# 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
33
Nader

既存の回答のいずれもタイトルの質問に直接回答するとは思わなかったので、チップを入れたいと思いました。

クライアント(ブラウザ)がWebサイトにアクセスすると、Webサイトはクライアントに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

サブドメインに個別のセッションを許可することについての質問の2番目の部分に既に回答しているようです。

19
Tyler Collier

tl; dr:@ Nader のコードを使用します。しかし、それを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: @ NaderCustomDomainCookieコードを使用する

これが Rackミドルウェア の出番です。より関連性の高いラック&Railsリソース:

基本的にこれは、すべてのCookieセッションデータをルートドメインに等しいまったく同じCookieファイルにマップし直すことです。

ステップ2:追加先Rails Config

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を指定することを提案した他の人々がいます。何らかの理由で、これは私にとってはうまくいかず、上記のカスタムミドルウェアクラスが必要でした。

次に、config/environments/production.rbに以下を追加します。

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

先行するドットが必要であることに注意してください。理由については、「 サブドメインCookie、親ドメインリクエストで送信されますか? 」を参照してください。

次に、config/environments/development.rbに以下を追加します。

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

Lvh.meトリックはlocalhostにマッピングされます。それは素晴らしいです。 サブドメインに関するこのRailscast および このノート を参照してください。

うまくいけばそれでうまくいくはずです。クロスサブドメインのサイトが一般的だと感じているため、このプロセスがなぜ複雑なのか、正直なところ完全にはわかりません。これらの各手順の背後にある理由について、さらに詳しい情報をお持ちの方は、コメントで教えてください。

12
Evan

このオプションは、アプリケーションがサブドメイン間でセッションを共有できるようにするために使用されます。 :allオプションは、アプリケーションのトップレベルドメインサイズが1であることを前提としています。そうでない場合は、代わりにドメイン名を指定でき、それがセッションのベースドメインとして使用されます。

10
Rishav Rastogi

うーん、

Www.xyz.comおよびxyz.comでホストされているアプリケーションをデプロイします。

私にとって、:domain =>:allは、セッションCookieのドメインをxyz.comに設定します。したがって、トップレベルドメインではなく、TLDの1レベル上です。

ヤン・ウィレム

1