我应该如何使所有Devise路径使用https?

jco*_*lum 7 ssl devise ruby-on-rails-3.1

相关:Rails 3 SSL路由重定向从https到http(遗憾的是无效).

重复,但答案对我不起作用:在设计上设置ssl

我有一个网络应用程序,现在已经工作了一段时间,但我需要将SSL添加到登录/编辑acct路径.我正在使用Devise进行身份验证.我在设计维基中找到了一个条目,使得这个过程看起来非常简单,但该死的,如果我可以让它工作的话.简单的部分是这样的:

#in config/environments/production.rb
config.to_prepare { Devise::SessionsController.force_ssl }
config.to_prepare { Devise::RegistrationsController.force_ssl }
Run Code Online (Sandbox Code Playgroud)

然后在这个要点中有大约25行代码:https://gist.github.com/1040964

我得到了足够好的工作,但是当我退出时,我从会话DELETE操作中获得了301,这使我获得了GET.

Started DELETE "/users/sign_out" for 98.246.164.160 at 2012-03-02 01:45:42 +0000
[02 Mar 01:45 10886   INFO]   Processing by Devise::SessionsController#destroy as HTML
[02 Mar 01:45 10886   INFO]   Parameters: {"authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxx="}
[02 Mar 01:45 10886  DEBUG] Parameters: {"_method"=>"delete", "authenticity_token"=>"fI4VZ4V0Go2Civo3sJz8Dv5/Wtaa90ynaYr+xxxx=", "action"=>"destroy", "controller"=>"devise/sessions"}
[02 Mar 01:45 10886   INFO] Redirected to https://ec2-xx-xx-106-255.us-west-2.compute.amazonaws.com/users/sign_out
[02 Mar 01:45 10886   INFO] Completed 301 Moved Permanently in 3ms

Started GET "/users/sign_out" for xx.xx.164.160 at 2012-03-02 01:45:42 +0000
[02 Mar 01:45 10886  FATAL] 
ActionController::RoutingError (No route matches [GET] "/users/sign_out"):
Run Code Online (Sandbox Code Playgroud)

所以我想我需要从头开始.使任何Devise路径使用https的最简单方法是什么,但我的应用程序中的其余路径使用http?我试过这个(从顶部的SO帖子):

 #devise routes
  scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
    devise_for :users, :controllers => { :registrations => :registrations }
    devise_for :admins
  end
Run Code Online (Sandbox Code Playgroud)

但是没有去.我需要一个更好的建议.

jco*_*lum 10

还没有答案,所以这就是我的结论:

  1. 一旦您通过https访问网站,请不要通过http访问它,直到用户退出(firesheep attack).在上面链接的文章中,Devise上有很多内容,只讨论登录/退出页面上的https.馊主意.

  2. 你真正需要的就是:

    #in config/environments/production.rb
    config.to_prepare { Devise::SessionsController.force_ssl }
    config.to_prepare { Devise::RegistrationsController.force_ssl }
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我有很多关于Devise的'after_sign_in_path'的问题.事实证明,after_sign_out_path_for期望返回一条路径 - 它不是一个事件,而是询问用户应该被定向到哪里.所以我回来root_path :protocol => 'http://'了,照顾它.