相关:Rails 3 SSL routing redirects from https to http(遗憾的是没有用)。
重复,但答案对我不起作用:setting up ssl on devise
我有一个网络应用程序,现在已经工作了一段时间,但我需要将SSL添加到登录/编辑acct路径。我正在使用Devise进行身份验证。我在设计维基中找到了一个条目,使得这个过程看起来很简单,但该死的,如果我可以让它工作的话。简单的部分是:
#in config/environments/production.rb
config.to_prepare { Devise::SessionsController.force_ssl }
config.to_prepare { Devise::RegistrationsController.force_ssl }
然后在这个要点中有大约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"):
所以我想我需要从头开始。使任何Devise路径使用https的最简单方法是什么,但我的应用程序中的其余路径使用http?我试过这个(从顶部的SO帖子):
#devise routes
scope :protocol => 'https://', :constraints => { :protocol => 'https://' } do
devise_for :users, :controllers => { :registrations => :registrations }
devise_for :admins
end
但是没有去。我需要一个更好的建议。
答案 0 :(得分:10)
还没有答案,所以这就是我的结论:
通过https访问某个网站后,请不要通过http访问该网站,直到用户退出(firesheep attack)。在上面链接的文章中,Devise上有很多内容,只讨论登录/退出页面上的https。馊主意。
你真正需要的是:
#in config/environments/production.rb
config.to_prepare { Devise::SessionsController.force_ssl }
config.to_prepare { Devise::RegistrationsController.force_ssl }
我在Devise中遇到了很多关于'after_sign_in_path'的问题。事实证明after_sign_out_path_for
期望返回一个路径 - 它不是一个事件,而是询问用户应该被定向到哪里。所以我退回了root_path :protocol => 'http://'
,并负责处理它。
答案 1 :(得分:3)
确保在所有Devise链接中使用https(这样可以避免使用force_ssl重定向)。
在routes.rb中(仅在生产环境中应用):
scope defaults: (Rails.env.production? ? { protocol: 'https' } : {}) do
devise_for :users
end
现在在您的应用程序中使用:
destroy_user_session_url # use _url instead of _path so the protocol is added!
现在,您的退出/退出链接(以及其他设计链接)将直接指向https。从HTTP DELETE到HTTPS GET的force_ssl重写被避免。一切正常:)
答案 2 :(得分:2)
尝试通过添加以下内容使整个应用使用HTTPS:
#in config/environments/production.rb
config.force_ssl = true
我遇到了同样的问题。有时我签好了有时我从DELETE操作得到301并重定向到GET。对我来说这就是问题所在。