ti-enxame.com

Rails 3 SSL descontinuado

Estou atualizando um aplicativo para Rails 3.0.0 e gostaria de saber se o método padrão para adicionar SSL mudou (lembro-me vagamente de demonstrações indicando que o roteador agora pode lidar com SSL, embora não tenha certeza se fosse apenas para fins de demonstração). Atualmente, uso a gema "ssl_requirement", mas ela oferece:

AVISO DE DEPRECAÇÃO: o uso de #request_uri está obsoleto. Em vez disso, use fullpath. (chamado de verify_proper_protocol em /Library/Ruby/Gems/1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53)

Além disso, parece quebrar ao manipular os novos atributos de 'método de dados'. Por exemplo:

<%= link_to "Logout", user_path, :method => :delete %>

Funciona bem ao acessar de uma seção SSL do aplicativo, mas falha (tenta renderizar mostrar ação) quando seguido de uma seção não SSL (todas as ações no controlador de usuário exigem SSL, embora eu entenda que a ação de destruição não transmite de forma segura dados).

28
Kevin Sylvestre

É realmente muito simples em Rails 3. Em config/routes.rb:

MyApplication::Application.routes.draw do
  resources :sessions, :constraints => { :protocol => "https" }
end

Ou se você precisar forçar SSL para várias rotas:

MyApplication::Application.routes.draw do
  scope :constraints => { :protocol => "https" } do 
    # All your SSL routes.
  end
end

E a vinculação a rotas SSL pode ser feita assim:

<%= link_to "Logout", sessions_url(:protocol => 'https'), :method => :delete %>

Se você deseja redirecionar automaticamente alguns controladores (ou na verdade, alguns subcaminhos) para uma URL baseada em https equivalente, você pode adicionar algo assim às suas rotas (gostaria que esta parte fosse mais simples):

# Redirect /foos and anything starting with /foos/ to https.
match "foos(/*path)", :to => redirect { |_, request|
  "https://" + request.Host_with_port + request.fullpath }
46
molf

Depois de passar uma tarde procurando a melhor solução, decidi pela abordagem descrita neste artigo: http://clearcove.ca/blog/2010/11/how-to-secure-a-Rails-app-on -heroku-with-ssl-firesheep / que fez referência a este artigo: Forçar SSL usando ssl_requirement em Rails 2 app

Basicamente, faça isso:

# 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"
20
Dan

Toppic é antigo, mas apenas para pessoas no Google:

em * app/controller/your_controller.rb *

 class LostPasswordsController < ApplicationController

   force_ssl

   def index
     #....
   end
 end 

se usar globalmente no controlador de aplicativo

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

... thx S.L. para dica

14
equivalent8

Posteriormente Rails (pelo menos 3.12+), você pode usar o seguinte, específico do ambiente:

em config/environment/production.rb (ou outro ambiente)

# Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies.
config.force_ssl = true
1
rcd