2011-12-13 17 views
5

Obecnie mam setup gdzie mogę zmusić SSL lub http, gdzie jest to potrzebne z tego before_filter w moim kontroler aplikacji:SSL specyficzne hosta w Heroku z 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 

Co chciałbym zrobić, to używać protokołu https://secure.example.com podczas korzystania z protokołu SSL, ale nie używaj protokołu http://example.com. Czy istnieje sposób przełączania się między nazwami hostów w zależności od tego, czy używam SSL?

+0

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

Odpowiedz

4

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

+0

Używałem force_ssl przed (jestem w Rails 3.1), ale nie znalazłem sposób, aby wymusić http, gdy nie chcę SSL, więc po prostu przetasowałem własne rozwiązanie w moim kontrolerze aplikacji. Czy istnieje sposób na dostosowanie force_ssl? –

+0

Możesz napisać niestandardową metodę klasy w module ForceSSL, która może zrobić coś odwrotnego niż ForceSSL, mógłbym wysłać przykład, jeśli chcesz? – digicazter