Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何设置rails真实性令牌来处理多个域?_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 如何设置rails真实性令牌来处理多个域?

Ruby on rails 如何设置rails真实性令牌来处理多个域?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在构建一个将子域用作帐户句柄(myaccount.domain.com)的应用程序,我将会话配置为跨子域工作,如下所示: config.action_controller.session = {:domain => '.domain.com'} 除了子域之外,用户在创建帐户时还可以输入真实的域名。我的Nginx配置被设置为监视*.com*.net等,这是为了提供页面 当站点访问者在用户输入的自定义域上提交评论表单时,就会出现问题。代码正在引发“无效AuthentityToken”异常

我正在构建一个将子域用作帐户句柄(myaccount.domain.com)的应用程序,我将会话配置为跨子域工作,如下所示:

config.action_controller.session = {:domain => '.domain.com'}
除了子域之外,用户在创建帐户时还可以输入真实的域名。我的Nginx配置被设置为监视*.com*.net等,这是为了提供页面

当站点访问者在用户输入的自定义域上提交评论表单时,就会出现问题。代码正在引发“无效AuthentityToken”异常。我99%确定这是因为用户所在的域没有在config.action\u controller.session中指定为域。因此,由于Rails找不到他们的会话,所以真实性令牌没有匹配


因此,问题是:能否将config.action\u controller.session设置为多个域,如果是,是否可以在运行时添加/删除该值,而无需重新启动应用程序

我在这里找到了这个问题的答案:

这个解决方案对我有效,因为我的应用程序运行在Rails 2.3.5上,它使用Rack。请求来自web服务器,通过中间件层进入应用程序。因此,该中间件层检测访问应用程序的主机,并为请求设置cookie域。这是:

# app/middlewares/set_cookie_domain.rb
class SetCookieDomain
  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)
    domain = @default_domain.sub(/^\./, '')
    host !~ Regexp.new("#{domain}$", Regexp::IGNORECASE)
  end
end


# turn it on in environment.rb
config.load_paths += %W( #{RAILS_ROOT}/app/middlewares )


# production.rb
config.middleware.use "SetCookieDomain", ".example.org"
.example.org是将使用的默认域,除非通过自定义域(如site.com)访问应用程序,否则我们根据环境(生产/暂存/开发等)为其指定不同的值

#tests/integration/set_cookie_domain_test.rb(使用Shoulda和Webrat)
需要“测试助手”
类SetCookieDomainTest
# tests/integration/set_cookie_domain_test.rb (using Shoulda and Webrat)
require 'test_helper'

class SetCookieDomainTest < ActionController::IntegrationTest

  context "when accessing site at example.org" do
    setup do
      host! 'example.org'
      visit '/'
    end

    should "set cookie_domain to .example.org" do
      assert_equal '.example.org', @integration_session.controller.request.session_options[:domain]
    end
  end

  context "when accessing site at site.com" do
    setup do
      host! 'site.com'
      visit '/'
    end

    should "set cookie_domain to .site.com" do
      assert_equal '.site.com', @integration_session.controller.request.session_options[:domain]
    end
  end

  context "when accessing site at site.example.org" do
    setup do
      host! 'site.example.org'
      visit '/'
    end

    should "set cookie_domain to .example.org" do
      assert_equal '.example.org', @integration_session.controller.request.session_options[:domain]
    end
  end

end