Cancan如何为Devise身份验证跳过授权检查

20
因为任何人都可以注册并登陆,而且用户在登陆后才会被识别为角色,所以跳过 Devise 的授权检查是有道理的吗?
基于这个前提,我从 Devise 注册控制器继承了这个 registrations_controller 并将它放在控制器目录中。
class Users::RegistrationsController < Devise::RegistrationsController
  skip_authorization_check
end

更改路由文件:

devise_for :users, :controllers => { :registrations => "registrations" }

不过我还缺少点什么:

This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check.

感谢你的帮助。


@RyanBigg,等我解决了这个问题,我会去看看你对上一个问题的答案是否适用于这个应用程序。谢谢。 - Jay
@Hosemeyer,我需要解决这个问题,然后才能按照你在另一个问题中的建议进行操作。感谢你的帮助。 - Jay
1个回答

42

简单的解决方案

check_authorization :unless => :devise_controller?

如果您必须在每个控制器中手动放置check_authorization,那么在某个时刻您可能会忘记并在应用程序中打开安全漏洞。最好通过cancan明确列出不需要身份验证的控制器白名单。
这在CANCAN文档中已经很清楚了。

https://github.com/ryanb/cancan/wiki/Ensure-Authorization

编辑

class ApplicationController < ActionController::Base
  check_authorization :unless => :do_not_check_authorization?
  private
  def do_not_check_authorization?
    respond_to?(:devise_controller?) or
    condition_one? or
    condition_two?
  end

  def condition_one?
   ...
  end

  def condition_two?
   ...
  end
end

感谢bradgonesurfing +1。当我回来修改和测试这段代码时,如果一切都按照你的方式进行,我会更改接受的答案。 - Jay
答案仍在Bigg先生那里,得分为(-1)。 - bradgonesurfing
对于其他人阅读此内容,我建议在布尔检查中 不要 使用 or,而应该使用 ||。否则,回答很棒。 - RyanJM
我只是想指出,:do_not_check_authorization?应该返回false以跳过授权。如果您使用:if => ...,则会期望true来跳过授权。 - FireDragon
1
@Andreas 过去它们的行为是不同的。看起来 Ruby 2.0 可能已经改变了这一点,但老习惯难改。http://estebanpastorino.com/2013/09/12/quick-ruby-tip-double-pipe-vs-or/ - RyanJM
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接