Подтвердить что ты не робот

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 не передавать защищенные данные).

4b9b3361

Ответ 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