0

我检查了名为的 gem ssl_requirement,它在某些操作上强制执行 SSL 并增强了 url 和路径助手,总体上看起来很有希望,但它太过时了,而且维护得不好。

有谁知道提供这种便利的任何更新的替代方案:

  1. 在控制器中需要 SSL,而不是在路由文件中。
  2. 自动选择https://URL 和路径助手,而不必破坏代码::protocol => 'https'?
  3. 能够在开发中禁用整个 SSL 强制执行
4

1 回答 1

3

你不需要 gem - 你可以写一个小助手来做这件事。

在应用程序控制器中:

def force_ssl(options = {})
  host = options.delete(:host)
  unless request.ssl? or Rails.env.development?
    redirect_options = {:protocol => 'https://', :status => :moved_permanently}
    redirect_options.merge!(:host => host) if host
    flash.keep
    redirect_to redirect_options and return
  else
    true
  end
end

然后在你的控制器中:

before_filter :force_ssl, :only => [:login]

不能满足您在路径帮助程序上自动选择 https 协议的第二个要求,但这不能通过控制器指定的 SSL 强制实现,因为路由帮助程序不关心控制器级别上发生的事情。这实际上与控制器强制 SSL 互斥,因为如果您的路由指定 HTTPS,那么它们不会将非 HTTPS URL 解析为控制器操作,这意味着您的force_ssl过滤器将永远不会被命中。但是,您可以通过复制您的路由来实现这一点,这样您就同时拥有 HTTPS 范围和无范围的路由,并且在 HTTPS 范围的路由之前定义了无范围的路由,以便 HTTPS 范围的版本采用帮助程序名称。不过,这确实意味着重复。

不过,您也许可以通过一些辅助方法来实现这一点。我没有对此进行测试,但这个概念应该有效:

def route_with_https_preference(&block)
  &block.call
  scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
    instance_eval &block
  end
end

route_with_https_preference do
  resources :gizmos do
    resources :widgets
  end
end

您可以在路由文件中轻松实现 SSL 范围的路由(有关详细信息,请参阅此答案),但这确实意味着您必须使用_url帮助程序而不是_path帮助程序,因为协议切换需要完全限定的 URL。

于 2012-10-28T16:31:02.820 回答