我检查了名为的 gem ssl_requirement
,它在某些操作上强制执行 SSL 并增强了 url 和路径助手,总体上看起来很有希望,但它太过时了,而且维护得不好。
有谁知道提供这种便利的任何更新的替代方案:
- 在控制器中需要 SSL,而不是在路由文件中。
- 自动选择
https://
URL 和路径助手,而不必破坏代码::protocol => 'https'
? - 能够在开发中禁用整个 SSL 强制执行
我检查了名为的 gem ssl_requirement
,它在某些操作上强制执行 SSL 并增强了 url 和路径助手,总体上看起来很有希望,但它太过时了,而且维护得不好。
有谁知道提供这种便利的任何更新的替代方案:
https://
URL 和路径助手,而不必破坏代码::protocol => 'https'
?你不需要 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。