Rails 3 SSL Deprecation - PullRequest
       23

Rails 3 SSL Deprecation

28 голосов
/ 03 сентября 2010

Я обновляю приложение до Rails 3.0.0 и мне интересно, изменился ли стандартный метод добавления SSL (я смутно помню демонстрации, указывающие, что маршрутизатор теперь может обрабатывать SSL, хотя я не уверен, что это было только для демонстрации цели). В настоящее время я использую камень "ssl_requirement", однако он дает:

ПРЕДУПРЕЖДЕНИЕ О УСТАРЕВАНИИ: Использование #request_uri устарело. Вместо этого используйте полный путь. (вызывается с sure_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, хотя я понимаю, что действие уничтожения делает не передавать защищенные данные).

Ответы [ 4 ]

46 голосов
/ 03 сентября 2010

Это действительно довольно просто в 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 }
20 голосов
/ 16 января 2011

Проведя день в поисках лучшего решения, я остановился на подходе, описанном в этой статье: 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"
14 голосов
/ 26 марта 2012

Toppic стар, но только для людей, гуглящих:

в * app / controller / your_controller.rb *

 class LostPasswordsController < ApplicationController

   force_ssl

   def index
     #....
   end
 end 

если глобально использовать его в контроллере приложений

http://apidock.com/rails/ActionController/ForceSSL/ClassMethods/force_ssl

... thx S.L. за чаевые

1 голос
/ 05 апреля 2014

В более поздних Rails (как минимум 3.12+) вы можете использовать следующее, зависящее от среды:

в config / средах / production.rb (или другой среде)

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...