2010-09-03 6 views
28

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

DEPRECATION AVERTISSEMENT: L'utilisation de #request_uri est obsolète. Utilisez plutôt fullpath. (Appelé de ensure_proper_protocol à /Library/Ruby/Gems/1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53)

En outre, il semble rompre lors de la manipulation de la nouvelle « méthode de données ' les attributs. Par exemple:

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

fonctionne très bien lors de l'accès d'une section SSL de l'application, mais échoue (tentatives de rendre l'action du spectacle) lorsqu'elle est suivie d'une section non-SSL (toutes les actions du contrôleur utilisateur nécessitent SSL, bien que Je comprends que l'action de destruction ne transmet pas de données sécurisées).

Répondre

46

Il est en effet assez simple dans Rails 3. config/routes.rb:

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

Ou si vous avez besoin de forcer SSL pour plusieurs routes:

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

et un lien vers des itinéraires SSL peut être fait comme celui-ci :

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

Si vous souhaitez rediriger automatiquement certains contrôleurs (ou en fait, certains sous-chemins) à une URL basée https équivalent, vous pouvez ajouter quelque chose comme ça à vos itinéraires (je souhaite que cette partie était plus simple):

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

Cela semble être plus complexe que d'utiliser 'ssl_requirement'. Est-ce la nouvelle méthode standard de le faire dans Rails 3 ou est-ce que 'ssl_requirement' est toujours utilisable? Merci. –

+1

@Kevin: En dehors de la redirection automatique, je pense que c'est assez facile. De plus, tout cela est possible avec le routage DSL * standard *, ce qui ne pouvait pas être fait dans Rails 2, d'où la nécessité d'une bibliothèque externe. – molf

+4

Dans l'environnement de développement, faites scope: constraints => {: protocol => Rails.env.production? ? 'https': 'http'} do ... fin Source: http://www.themomorohoax.com/2010/10/08/using-ssl-in-rails-3 – mysmallidea

20

Après avoir passé un après-midi à la recherche de la meilleure solution je me suis installé sur l'approche décrit 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: Force SSL using ssl_requirement in Rails 2 app

font essentiellement ceci:

# 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

Je préfère cette méthode car la solution de @ molf nécessite SSL même dans l'environnement de développement. –

14

Toppic est vieux, mais seulement pour les personnes googler:

dans application */contrôleur/your_controller.rb *

class LostPasswordsController < ApplicationController 

    force_ssl 

    def index 
    #.... 
    end 
end 

si globalement l'utilisation dans le contrôleur d'application

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

... thx S.L. pour la pointe

+0

Merci pour ça. Combiné avec les options 'except' et' only', c'est une excellente solution pour SSL sélectif. – LouieGeetoo

+1

rails seulement 3.1 si –

+0

b.t.w. il y a une différence entre 'config.force_ssl' et controller' force_ssl' http://www.eq8.eu/blogs/14-config-force_ssl-is-different-than-controller-force_ssl – equivalent8

1

Plus tard Rails (au moins 3.12+), vous pouvez utiliser ce qui suit, l'environnement spécifique:

dans config/environnements/production.rb (ou tout autre environnement)

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