Comment définir l'accès de contrôle-allow-origine dans webrick sous rails?
-
22-09-2019 - |
Question
J'ai écrit une petite application de rails pour servir du contenu à un autre site via XMLHttpRequests qui opéreraient à partir d'un autre domaine (il ne sera pas possible de les faire fonctionner sur le même serveur). Je comprends que je vais devoir mettre de contrôle d'accès permettent aux origine sur mon serveur rails pour permettre à la page Web demandant d'accéder à ce matériel.
Il semble assez bien documenté comment faire avec Apache et ce qui est probablement le serveur que je vais utiliser une fois que je Déployez le site. Alors que je développe si j'espère juste utiliser webrick comme je suis habitué à faire avec des rails. Est-il possible de configurer webrick pour fournir l'en-tête HTTP approprié dans les rails?
La solution
Si vous êtes sur Rails 2 ajouter ceci à votre contoller d'application.
before_filter :set_access
def set_access
@response.headers["Access-Control-Allow-Origin"] = "*"
end
Il est évident que le changement "*"
à quelque chose d'un peu moins ouvert serait une bonne idée.
Autres conseils
Rails 4 ( http://edgeguides.rubyonrails.org/security.html#default-headers)
Dans config / application.rb:
config.action_dispatch.default_headers.merge!({
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => '*'
})
Rails 3.1
class ApplicationController < ActionController::Base
protect_from_forgery
after_filter :set_access_control_headers
def set_access_control_headers
headers['Access-Control-Allow-Origin'] = '*'
headers['Access-Control-Request-Method'] = '*'
end
end
Rails 3.1 - en utilisant un contrôleur after_filter n'a pas fonctionné pour moi, donc j'ai ajouté à la place d'un middleware personnalisé:
app / middleware / cors_middleware.rb:
# For icons to work in Firefox with CDN
class CorsMiddleware
def initialize(app)
@app = app
end
def call(env)
status, headers, body = @app.call(env)
cors_headers = headers.merge({
'Access-Control-Allow-Origin' => '*',
'Access-Control-Request-Method' => '*'
})
[status, cors_headers, body]
end
end
Dans config / application.rb:
require File.join(Rails.root, "app", "middleware", "cors_middleware")
config.middleware.insert_before ActionDispatch::Static, CorsMiddleware # Need it early in the chain to work for assets
Rails 2.3.8
before_filter :allow_cross_domain_access
def allow_cross_domain_access
response.headers["Access-Control-Allow-Origin"] = "*"
response.headers["Access-Control-Allow-Methods"] = "*"
end
Si vous voulez la solution comme un petit bijou de middleware Rack: https://github.com/cyu/rack-cors