27 votes

Rails 3 SSL Deprecation (en anglais)

Je suis en train de mettre à jour une application vers Rails 3.0.0 et je me demande si la méthode standard pour ajouter SSL a changé (je me souviens vaguement de démos indiquant que le routeur pouvait maintenant gérer SSL, mais je ne suis pas sûr que c'était juste à des fins de démonstration). J'utilise actuellement la gemme "ssl_requirement", mais elle donne :

AVERTISSEMENT DE DÉCRYPTAGE : L'utilisation de #request_uri est obsolète. Utilisez fullpath à la place. (appelé depuis ensure_proper_protocol at /Library/Ruby/Gems/1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53)

De plus, il semble qu'il ne fonctionne pas lorsqu'il gère les nouveaux attributs "data-method". Par exemple :

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

Cela fonctionne bien lorsque l'accès se fait à partir d'une section SSL de l'application, mais échoue (tente de rendre l'action show) lorsque l'accès se fait à partir d'une section non-SSL (toutes les actions dans le contrôleur d'utilisateur nécessitent SSL, bien que je comprenne que l'action de destruction ne transmet pas de données sécurisées).

46voto

molf Points 34978

C'est en effet assez simple dans Rails 3. En config/routes.rb :

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

Ou si vous devez forcer SSL pour plusieurs itinéraires :

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

L'établissement d'un lien vers les itinéraires SSL peut se faire de la manière suivante :

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

Si vous souhaitez rediriger automatiquement certains contrôleurs (ou en fait, certains sous-chemins) vers une URL équivalente basée sur https, vous pouvez ajouter quelque chose comme ceci à vos routes (j'aurais aimé que cette partie soit plus simple) :

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

20voto

Dan Points 859

Après avoir passé un après-midi à chercher la meilleure solution, j'ai opté pour l'approche décrite dans cet article : http://clearcove.ca/blog/2010/11/how-to-secure-a-rails-app-on-heroku-with-ssl-firesheep/ qui fait référence à cet article : Forcer SSL en utilisant ssl_requirement dans une application Rails 2

Voici ce qu'il faut faire :

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

13voto

equivalent8 Points 2009

Toppic est vieux, mais c'est juste pour trouver des gens sur Google :

dans *app/controller/your_controller.rb*

 class LostPasswordsController < ApplicationController

   force_ssl

   def index
     #....
   end
 end 

si on l'utilise globalement dans le contrôleur d'application

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

...merci S.L. pour le conseil

0voto

rcd Points 546

Dans les versions ultérieures de Rails (au moins 3.12+), vous pouvez utiliser ce qui suit, spécifique à l'environnement :

dans config/environments/production.rb (ou autre environnement)

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X