Rails - 仅在开发中允许 CORS 设置中的本地主机

Rails - Allow localhost in CORS settings only in development

我正在为我的 rails 服务器配置 CORS 设置 - 我希望能够在 运行 本地测试我的后端,使用本地主机上的前端。

但是,据我了解,CORS 是针对 CSRF(?) 的重要安全机制,因此当应用程序投入生产时,我希望后端仅允许实时网站的来源。像这样:


if development:
  allow do
    origins 'localhost:3000', 'localhost:3001', 'https://my-app.com'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

if production:
  allow do
    origins 'https://my-app.com'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

我知道在本地主机上有一个未知用户 运行 一个恶意应用程序并且不知道他们在做什么是一件很困难的事情,但我还是要说安全而不是抱歉。

我该怎么做?为什么这没有在 Rack::CORS 的 Github 页面上突出显示?我有一种感觉,我缺少了什么。请赐教。

如果您使用 Rails 5 或更早版本,您可以在将 Rack::CORS 中间件注入堆栈时处理配置:

# config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    if Rails.env.development?
      origins 'localhost:3000', 'localhost:3001', 'https://my-app.com'
    else
      origins 'https://my-app.com'
    end

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

由于您的 Rails 应用程序是在加载初始值设定项时启动的,因此您可以通过 Rails.env 确定环境。如果你想避免硬编码,你可以使用环境变量。