Ruby on rails 如何设置rails真实性令牌来处理多个域?
我正在构建一个将子域用作帐户句柄(myaccount.domain.com)的应用程序,我将会话配置为跨子域工作,如下所示: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”异常
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