2010-10-05 8 views
20

Tengo una aplicación Rails que necesita ejecutarse bajo SSL. Intenté ssl_requirement pero parece que tengo que escribir todas las acciones en todos los controladores.Forzar SSL usando ssl_requirement en la aplicación Rails 2

¿Hay algún método que pueda agregar un before_filter en el controlador de la aplicación con ssl_requirement, para que las aplicaciones se redirijan a https automáticamente cuando la solicitud del usuario está en http?

Gracias a todos. :)

+0

Gracias por el recordatorio. Título modificado. :) –

Respuesta

32

Utilice un Rack Middleware.

# lib/force_ssl.rb 
class ForceSSL 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    if env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https' 
     @app.call(env) 
    else 
     req = Rack::Request.new(env) 
     [301, { "Location" => req.url.gsub(/^http:/, "https:") }, []] 
    end 
    end 
end 

# config/environment.rb 
config.middleware.use "ForceSSL" 
+0

está funcionando bien. gracias amigo. :) –

+2

'lib/force_ssl.rb' no se incluirá de manera predeterminada en Rails 3.0.X. Necesitará agregar esta línea a su 'application.rb':' requerir File.expand_path ('../../ lib/force_ssl.rb', __FILE __) 'o hacer algún tipo de 'requerimiento' similar en otro lugar. Además, la línea 'config.middleware.use" ForceSSL "' debe ir en 'config/environments/production.rb'. –

+6

Como lo señaló Simone Carletti, en los rieles> = 3.1 existe un método de force_ssl disponible. Ver http://www.simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl/ –

4

Usted puede intentar la prueba si la solicitud está en SSL o no en un before_filter en su aplicación

class Application < AC::Base 

    before_filter :need_ssl 

    def need_ssl 
    redirect_to "https://#{request.host}/#{request.query_string}" unless request.ssl? 
    end 
end 
+0

oops ... recibí un error. método indefinido 'ssl? ' –

+1

¿Quizás no estás en Rails 3? – shingara

+0

todavía estoy en los rieles 2 ... así que esto está en los rieles 3, ¿verdad? –

1

El problema clave es que force_ssl.rb no está siendo cargado y que lib no se carga por defecto en los carriles 3.1. Usted tiene que agregar

config.autoload_paths += %W(#{config.root}/lib) 
config.autoload_paths += Dir["#{config.root}/lib/**/"] 

a application.rb

Cuestiones relacionadas