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
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