tutorial software rails ejemplos descargar curso caracteristicas ruby-on-rails

ruby-on-rails - software - ruby on rails tutorial



Rails 3 Deprecation SSL (4)

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 de si era solo para fines de demostración). Actualmente uso la gema "ssl_requirement", sin embargo me da:

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

Además, parece que se rompe cuando se manejan los nuevos atributos de ''método de datos''. Por ejemplo:

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

Funciona bien al acceder desde una sección SSL de la aplicación, pero falla (intenta reproducir la acción mostrar) cuando se sigue desde una sección no SSL (todas las acciones en el controlador requieren SSL, aunque entiendo que la acción de destrucción no se transmite de forma segura datos).


De hecho, es 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 el enlace a las rutas SSL se puede hacer así:

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

Si desea redireccionar automáticamente algunos controladores (o, en realidad, algunos subpases) a una URL https equivalente, puede agregar algo como esto a sus rutas (me gustaría que esta parte fuera 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 }


Después de pasar una tarde buscando la mejor solución, me decidí por el enfoque descrito en este artículo: http://clearcove.ca/blog/2010/11/how-to-secure-a-rails-app-on-heroku-with-ssl-firesheep/ que hace referencia a este artículo: Forzar SSL utilizando ssl_requirement en la aplicación Rails 2

Básicamente haz 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"


En los Rails posteriores (al menos 3.12+) puede usar lo siguiente, específico del entorno:

en config / environments / 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