Rails 3 SSL Устаревание
Я обновляю приложение до Rails 3.0.0, и мне интересно, изменился ли стандартный метод добавления SSL (я смутно помню демонстрации, указывающие, что маршрутизатор теперь может обрабатывать SSL, хотя я не уверен, что это было просто для демонстрации цели). В настоящее время я использую камень "ssl_requirement", однако он дает:
ПРЕДУПРЕЖДЕНИЕ О ДЕПРЕКАЦИИ: Использование #request_uri устарело. Вместо этого используйте полный путь. (вызывается из обеспечения_proper_protocol в /Library/Ruby/Gems/ 1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53)
Кроме того, он, похоже, прерывается при обработке новых атрибутов "data-method". Например:
<%= link_to "Logout", user_path, :method => :delete %>
Прекрасно работает при доступе из секции SSL приложения, но сбой (попытки отображения действия show), если следовать из раздела, отличного от SSL (все действия в пользовательском контроллере требуют SSL, хотя я понимаю, что действие destroy не передавать защищенные данные).
Ответы
Ответ 1
Это действительно довольно просто в Rails 3. В config/routes.rb
:
MyApplication::Application.routes.draw do
resources :sessions, :constraints => { :protocol => "https" }
end
Или, если вам нужно принудительно использовать SSL для нескольких маршрутов:
MyApplication::Application.routes.draw do
scope :constraints => { :protocol => "https" } do
# All your SSL routes.
end
end
И связь с SSL-маршрутами может быть выполнена следующим образом:
<%= link_to "Logout", sessions_url(:protocol => 'https'), :method => :delete %>
Если вы хотите автоматически перенаправить некоторые контроллеры (или, фактически, некоторые подпапки) на эквивалентный URL-адрес на основе https, вы можете добавить что-то вроде этого к вашим маршрутам (я хочу, чтобы эта часть была проще):
# Redirect /foos and anything starting with /foos/ to https.
match "foos(/*path)", :to => redirect { |_, request|
"https://" + request.host_with_port + request.fullpath }
Ответ 2
Проведя день, чтобы найти лучшее решение, я остановился на подходе, описанном в этой статье: http://clearcove.ca/blog/2010/11/how-to-secure-a-rails-app-on-heroku-with-ssl-firesheep/, который ссылался на эту статью: Использовать SSL с помощью ssl_requirement в приложении Rails 2
В основном это:
# lib/middleware/force_ssl.rb
class ForceSSL
def initialize(app)
@app = app
end
def call(env)
if env['HTTPS'] == 'on' || env['HTTP_X_FORWARDED_PROTO'] == 'https'
@app.call(env)
else
req = Rack::Request.new(env)
[301, { "Location" => req.url.gsub(/^http:/, "https:") }, []]
end
end
end
# config/application.rb
config.autoload_paths += %W( #{ config.root }/lib/middleware )
# config/environments/production.rb
config.middleware.use "ForceSSL"
Ответ 3
Топпик старый, но только для людей с поисковой системой:
in * app/controller/your_controller.rb *
class LostPasswordsController < ApplicationController
force_ssl
def index
#....
end
end
если глобально использовать его в контроллере приложений
http://apidock.com/rails/ActionController/ForceSSL/ClassMethods/force_ssl
... спасибо S.L. для наконечника
Ответ 4
В более поздних Rails (не менее 3.12+) вы можете использовать следующие, относящиеся к среде:
в config/environment/production.rb(или в другой среде)
# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true