Najpierw pokażę, jak wymusić SSL w aktualnych i wcześniejszych wersjach Railsów, a na końcu zamieściłem, jak używać HTTP i HTTPS równolegle ze sobą, co jest według mnie tym, czego szukacie.
Rails> = 3,1
config.force_ssl = true
Wystarczy użyć w konfiguracji środowiska.
# config/application.rb
module MyApp
class Application < Rails::Application
config.force_ssl = true
end
end
Można również selektywnie włączyć https zależnie od aktualnego środowiska Rails. Na przykład możesz chcieć wyłączyć HTTPS podczas programowania i włączyć go na etapie przemieszczania/produkcji.
# 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
Szyny < 3,1
Tylko w przypadku jakichkolwiek projektów, które nie są Rails 3.1 i mają tę samą funkcję. Włącz HTTPS, dodając następujący wiersz do konfiguracji środowiska.
config.middleware.insert_before ActionDispatch::Static, "Rack::SSL"
Zauważ, że olewam Rack::SSL
jako ciąg delegować ładowanie klasy na koniec inicjalizacji aplikacji Rails. Należy również zauważyć, że oprogramowanie pośrednie musi być umieszczone w określonej pozycji w stosie, przynajmniej przed ActionDispatch::Static
i ActionDispatch::Cookies
.
Nie zapomnij zdefiniować zależności Rack :: SSL w swoim Gemfile.
# Gemfile
gem 'rack-ssl', :require => 'rack/ssl'
Włączenie HTTPS i HTTP równolegle
Rack::SSL
jest bardzo interesujący, nielegalnych funkcję. Możesz przekazać opcję :exclude
, aby określić, kiedy włączyć/wyłączyć korzystanie z HTTPS.
Poniższy kod włącza Rack::SSL
i wszystkie jego filtry tylko w przypadku, gdy żądanie pochodzi z połączenia HTTPS.
config.middleware.insert_before ActionDispatch::Static, Rack::SSL, :exclude => proc { |env| env['HTTPS'] != 'on' }
Zarówno następujące adresy będą nadal działać, ale pierwszy z nich wywoła filtry Rack::SSL
.
https://secure.example.com
http://example.com
Dlaczego przeszkadza zmuszając użytkowników do uwierzytelniania za pomocą protokołu SSL, kiedy, jak tylko uwierzytelnianie odbywa, ktoś może włamać swoje sesje z np firesheep, darmowy add-out do Firefoksa.Jeśli spróbujesz użyć protokołu SSL w ten sposób, nie chronisz swoich użytkowników. Zamiast tego, jeśli jakaś część witryny musi być dostarczona przez SSL, to z rzeczywistej perspektywy bezpieczeństwa prawdopodobnie każda część witryny musi zostać dostarczona za pośrednictwem protokołu SSL (lub przynajmniej każda część po uwierzytelnieniu). – yfeldblum