2011-12-13 12 views
5

momento ho una configurazione in cui forzo SSL o HTTP in cui ho bisogno di questo before_filter nel mio controller applicazione:SSL-specifica in 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 

Quello che mi piacerebbe fare è per utilizzare https://secure.example.com quando si utilizza SSL ma continuare a utilizzare http://example.com quando non si utilizza SSL. C'è un modo per passare da un nome all'altro a seconda che io stia usando SSL?

+0

Perché preoccuparsi costringendo gli utenti di autenticarsi tramite SSL quando, non appena l'autenticazione è fatto, chiunque può incidere le loro sessioni con per esempio firesheep, l'addon di firefox free session-hacking.Se cerchi di utilizzare SSL in questo modo, non stai proteggendo i tuoi utenti. Invece, se una parte del tuo sito deve essere distribuita su SSL, allora da una prospettiva di sicurezza effettiva è probabile che ogni parte del tuo sito debba essere consegnata anche su SSL (o, almeno, ogni parte che segue l'autenticazione). – yfeldblum

risposta

4

Per prima cosa mostrerò come forzare SSL nelle versioni correnti e precedenti di Rails, quindi alla fine ho pubblicato come utilizzare HTTP e HTTPS in parallelo tra loro, che è ciò che penso che stai cercando.

Rails> = 3.1

Basta usare config.force_ssl = true nella configurazione dell'ambiente.

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

È inoltre possibile abilitare selettivamente https a seconda dell'ambiente Rails corrente. Ad esempio, è possibile mantenere HTTPS disattivato in fase di sviluppo e abilitarlo in staging/produzione.

# 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 

Rails < 3,1

Nel caso in cui si dispone di progetti che non sono Rails 3.1 e vogliono la stessa caratteristica. Abilita HTTPS aggiungendo la seguente riga alla configurazione dell'ambiente.

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

noti che sto passando Rack::SSL come stringa di delegare il caricamento della classe al termine della inizializzazione dell'applicazione Rails. Si noti inoltre che il middleware deve essere inserito in una posizione specifica nella pila, almeno prima di ActionDispatch::Static e ActionDispatch::Cookies.

Non dimenticare di definire la dipendenza Rack :: SSL nel tuo Gemfile.

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

Abilitazione HTTPS e HTTP in parallelo

Rack::SSL ha una caratteristica molto interessante e documentato. È possibile passare un'opzione :exclude per determinare quando abilitare/disabilitare l'utilizzo di HTTPS.

Il seguente codice abilita Rack::SSL e tutti i suoi filtri solo nel caso in cui la richiesta provenga da una connessione HTTPS.

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

Sia i seguenti URL continueranno a funzionare, ma il primo attiveranno i Rack::SSL filtri.

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

+0

Stavo usando force_ssl prima (sono in Rails 3.1) ma non ho trovato un modo per forzare http quando non volevo SSL, quindi ho semplicemente fatto girare la mia soluzione nel mio controller dell'applicazione. C'è un modo per personalizzare force_ssl? –

+0

Si potrebbe scrivere un metodo di classe personalizzato nel modulo ForceSSL che potrebbe fare esattamente l'opposto di ForceSSL, potrei pubblicare un esempio se lo si desidera? – digicazter