【问题标题】:Rails 3 SSL DeprecationRails 3 SSL 弃用
【发布时间】:2011-04-07 17:45:18
【问题描述】:

我正在将应用程序升级到 Rails 3.0.0 并且想知道添加 SSL 的标准方法是否已更改(我依稀记得演示表明路由器现在可以处理 SSL,但我不确定它是否只是为了演示目的)。我目前使用“ssl_requirement”gem,但是它提供了:

弃用警告:不推荐使用#request_uri。请改用完整路径。 (从 /Library/Ruby/Gems/1.8/gems/ssl_requirement-0.1.0/lib/ssl_requirement.rb:53 的 ensure_proper_protocol 调用)

此外,在处理新的“数据方法”属性时,它似乎会中断。例如:

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

从应用程序的 SSL 部分访问时工作正常,但从非 SSL 部分(用户控制器中的所有操作都需要 SSL,尽管我知道销毁操作确实如此)时失败(尝试呈现显示操作)不传输安全数据)。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    在以后的 Rails(至少 3.12+)中,您可以使用以下特定于环境的:

    在 config/environments/production.rb(或其他环境)中

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

    【讨论】:

      【解决方案2】:

      主题很旧,但仅适用于谷歌搜索:

      在 *app/controller/your_controller.rb* 中

       class LostPasswordsController < ApplicationController
      
         force_ssl
      
         def index
           #....
         end
       end 
      

      如果在应用程序控制器中全局使用它

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

      ...谢谢 S.L.给小费

      【讨论】:

      • 谢谢。结合exceptonly 选项,这是选择性SSL 的绝佳解决方案。
      • b.t.w. config.force_ssl 和控制器 force_ssl eq8.eu/blogs/… 之间存在差异@
      【解决方案3】:

      在 Rails 3 中确实非常简单。在 config/routes.rb:

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

      或者如果您需要对多个路由强制使用 SSL:

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

      链接到 SSL 路由可以这样完成:

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

      如果您希望自动将某些控制器(或者实际上是某些子路径)重定向到等效的基于 https 的 URL,您可以在路由中添加类似这样的内容(我希望这部分更简单):

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

      【讨论】:

      • 这似乎比使用 'ssl_requirement' 更复杂。它是在 Rails 3 中执行此操作的新标准方法还是“ssl_requirement”仍然可用?谢谢。
      • @Kevin:除了自动重定向之外,我认为这很容易。此外,这一切都可以通过 standard 路由 DSL 实现,这在 Rails 2 中无法实现,因此需要外部库。
      • 在开发环境中,做 scope :constraints => { :protocol => Rails.env.production? ? 'https' : 'http' } do ... end 来源:themomorohoax.com/2010/10/08/using-ssl-in-rails-3
      • 请注意,在 Rails 3.1 中,它变得越来越简单:simonecarletti.com/blog/2011/05/configuring-rails-3-https-ssl
      • 您提供的match 规则会创建一个重定向循环。
      【解决方案4】:

      花了一个下午寻找最佳解决方案后,我决定采用本文中描述的方法:http://clearcove.ca/blog/2010/11/how-to-secure-a-rails-app-on-heroku-with-ssl-firesheep/ 引用了这篇文章:Force SSL using ssl_requirement in Rails 2 app

      基本上是这样做的:

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

      【讨论】:

      • 我更喜欢这种方法,因为@molf 的解决方案即使在开发环境中也需要 SSL。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多