2010-09-03 27 views
28

Estoy actualizando una aplicación a Rails 3.0.0 y me pregunto si el método estándar para agregar SSL ha cambiado (recuerdo vagamente demos que indican que el enrutador ahora podría manejar SSL, aunque no estoy seguro si fue solo para fines de demostración). Actualmente uso la gema "ssl_requirement", sin embargo da:Rails 3 SSL Deprecation

DEPRESIÓN ADVERTENCIA: El uso de #request_uri está en desuso. Use fullpath en su lugar. (Llamado a partir de ensure_proper_protocol en /Library/Ruby/Gems/1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53)

También, parece a romperse cuando el manejo de la nueva '-método de datos 'atributos. Por ejemplo:

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

funciona bien cuando se accede desde una sección de SSL de la aplicación, pero falla (intentos de hacer acción show) cuando se sigue de una sección no SSL (todas las acciones en el controlador de usuario requieren SSL, aunque Entiendo que la acción de destrucción no transmite datos seguros).

Respuesta

46

Es de hecho bastante simple en Rails 3. En config/routes.rb:

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

O si necesita forzar SSL para múltiples rutas:

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

y la vinculación a rutas SSL se puede hacer como esto :

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

Si desea redirigir automáticamente algunos controladores (o de hecho, algunos subtrazados) a una dirección URL basada en HTTPS equivalente, se puede añadir algo como esto a sus rutas (Deseo que esta parte era más simple):

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

Esto parece ser más complejo que usar 'ssl_requirement'. ¿Es el nuevo método estándar de hacerlo en Rails 3 o es 'ssl_requirement' aún utilizable? Gracias. –

+1

@Kevin: además de la redirección automática, creo que es bastante fácil. Además, todo esto es posible con el enrutamiento DSL * estándar *, algo que no se podía hacer en Rails 2, de ahí la necesidad de una biblioteca externa. – molf

+4

En el entorno de desarrollo, haga alcance: constraints => {: protocol => Rails.env.production? ? 'https': 'http'} do ... final Fuente: http://www.themomorohoax.com/2010/10/08/using-ssl-in-rails-3 – mysmallidea

20

Después de pasar una tarde en busca de la mejor solución que se establecieron en el enfoque descrito en este artículo: http://clearcove.ca/blog/2010/11/how-to-secure-a-rails-app-on-heroku-with-ssl-firesheep/ la que hace referencia este artículo: Force SSL using ssl_requirement in Rails 2 app

Básicamente hacer esto:

# 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" 
+1

Prefiero este método ya que la solución de @molf requiere SSL incluso en el entorno de desarrollo. –

14

Toppic es antiguo, pero sólo para la gente buscando en google:

en aplicación */controlador/your_controller.rb *

class LostPasswordsController < ApplicationController 

    force_ssl 

    def index 
    #.... 
    end 
end 

si globalmente usarlo en controlador de aplicación

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

... THX S.L. para punta

+0

Gracias por esto. Combinado con las opciones 'except' y' only', esta es una gran solución para SSL selectivo. – LouieGeetoo

+1

rieles 3.1 solo aunque –

+0

b.t.w. hay una diferencia entre 'config.force_ssl' y controller' force_ssl' http://www.eq8.eu/blogs/14-config-force_ssl-is-different-than-controller-force_ssl – equivalent8

1

En Rails posteriores (al menos 3.12+), puede utilizar el siguiente, específica del entorno:

en config/ambientes/production.rb (u otro entorno)

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