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
Toppic es viejo pero solo para googlear personas:
en * app / controller / your_controller.rb *
class LostPasswordsController < ApplicationController
force_ssl
def index
#....
end
end
si globalmente úsala en el controlador de aplicaciones
http://apidock.com/rails/ActionController/ForceSSL/ClassMethods/force_ssl
... thx SL por consejo