2011-12-13 11 views
5

Actualmente tengo una configuración en la fuerzo SSL o http, donde lo necesito con este before_filter en mi controlador de aplicación:nombre de host SSL específico en Heroku con Rails 3.1

def force_ssl 
    if params[:controller] == "sessions" 
    if !request.ssl? && Rails.env.production? 
     redirect_to :protocol => 'https://', :status => :moved_permanently 
    end 
    else 
    if request.ssl? && Rails.env.production? 
     redirect_to :protocol => 'http://', :status => :moved_permanently 
    end 
    end 
end 

Lo que me gustaría hacer es para usar https://secure.example.com al usar SSL, pero siga usando http://example.com cuando no use SSL. ¿Hay alguna forma de que pueda cambiar entre los nombres de los hosts dependiendo de si estoy usando SSL?

+0

¿Por qué molestarse obligando a sus usuarios para autenticar a través de SSL cuando, tan pronto como la autenticación se realiza, cualquiera puede piratear sus sesiones con, por ejemplo, fireresheep, el complemento gratuito para hackear Firefox de sesiones.Si intenta usar SSL de esta manera, no está protegiendo a sus usuarios. En cambio, si alguna parte de su sitio necesita ser entregada a través de SSL, entonces desde una perspectiva de seguridad real es probable que cada parte de su sitio necesite ser entregada a través de SSL también (o, al menos, cada parte después de la autenticación). – yfeldblum

Respuesta

4

En primer lugar voy a mostrar cómo forzar SSL en las versiones actuales y anteriores de los carriles, luego, al final he fijado cómo utilizar HTTP y HTTPS en paralelo entre sí, que es lo que creo que tu buscas.

Rieles> = 3.1

Utilice simplemente config.force_ssl = true en la configuración del entorno.

# config/application.rb 
module MyApp 
    class Application < Rails::Application 
    config.force_ssl = true 
    end 
end 

También puede activar selectivamente https dependiendo del entorno de Rails actual. Por ejemplo, es posible que desee mantener HTTPS desactivado en el desarrollo y habilitarlo en etapas/producción.

# config/application.rb 
module MyApp 
    class Application < Rails::Application 
    config.force_ssl = false 
    end 
end 

# config/environments/production.rb 
MyApp::Application.configure do 
    config.force_ssl = true 
end 

rieles < 3,1

En caso de que algún proyecto que no son rieles 3.1 y quieren la misma característica. Habilite HTTPS agregando la siguiente línea a la configuración de su entorno.

config.middleware.insert_before ActionDispatch::Static, "Rack::SSL"

Tenga en cuenta que estoy pasando Rack::SSL como cadena de delegar la carga de la clase al final de la inicialización de la aplicación Rails. También tenga en cuenta que el middleware debe insertarse en una posición específica en la pila, al menos antes de ActionDispatch::Static y ActionDispatch::Cookies.

No olvide definir la dependencia Rack :: SSL en su Gemfile.

# Gemfile 
gem 'rack-ssl', :require => 'rack/ssl' 

Habilitación de HTTPS y HTTP en paralelo

Rack::SSL tiene una característica muy interesante y documentada. Puede pasar una opción :exclude para determinar cuándo habilitar/deshabilitar el uso de HTTPS.

El siguiente código habilita Rack::SSL y todos sus filtros solo en caso de que la solicitud provenga de una conexión HTTPS.

config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' } 

Tanto las siguientes URL seguirán funcionando, pero el primero activarán los filtros Rack::SSL.

https://secure.example.com
http://example.com

+0

Estaba usando force_ssl antes (estoy en Rails 3.1) pero no encontré la manera de forzar http cuando no quería SSL, así que acabo de lanzar mi propia solución en mi controlador de aplicación. ¿Hay alguna manera de personalizar force_ssl? –

+0

Podría escribir un método de clase personalizado en el módulo ForceSSL que podría hacer exactamente lo contrario de ForceSSL, ¿podría publicar un ejemplo si lo desea? – digicazter

Cuestiones relacionadas