Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 3 可以跳过授权检查以进行设备身份验证_Ruby On Rails 3_Devise_Cancan - Fatal编程技术网

Ruby on rails 3 可以跳过授权检查以进行设备身份验证

Ruby on rails 3 可以跳过授权检查以进行设备身份验证,ruby-on-rails-3,devise,cancan,Ruby On Rails 3,Devise,Cancan,因为任何人都可以注册然后登录,。。。而且,由于用户在登录后才被识别为角色,所以跳过Desive的授权检查难道没有意义吗 在这个前提下,我用这个registrations\u控制器继承了designe注册控制器,并将其放在controller目录中 class Users::RegistrationsController < Devise::RegistrationsController skip_authorization_check end 但我遗漏了一些东西: This acti

因为任何人都可以注册然后登录,。。。而且,由于用户在登录后才被识别为角色,所以跳过Desive的授权检查难道没有意义吗

在这个前提下,我用这个registrations\u控制器继承了designe注册控制器,并将其放在controller目录中

class Users::RegistrationsController < Devise::RegistrationsController
  skip_authorization_check
end
但我遗漏了一些东西:

This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check.
谢谢您的帮助。

简单的解决方案

check_authorization :unless => :devise_controller?
如果你必须在某个时候手动在每个控制器中设置check_授权,你会忘记并在应用程序中打开一个安全漏洞。最好明确列出不需要cancan验证的控制器的白名单

这一点在CANCAN文件中有明确的说明

编辑

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
class ApplicationController:不检查授权?
私有的
def不检查授权?
响应(:设计控制器?)或
情况如何?或
条件二?
结束
什么情况?
...
结束
def条件2?
...
结束
结束

@RyanBigg,当我讨论完这个问题后,我会看看你对前面问题的回答是否正确。谢谢。@Hosemeyer,我需要先解决这个问题,然后才能在另一个问题上听从你的建议。谢谢你的帮助。谢谢BradGonessurfing+1。当我回来修改和测试这段代码时,如果一切都按照你的方式进行,我将更改已接受的答案。答案仍然与Bigg先生在一起,他的分数为(-1)。我面临的问题是,除了Desive控制器,还有两个其他控制器我想跳过。我无法修改“除非”条件以添加这些。我可以在上面加上“跳过授权检查”,但如果应用程序中只有一个位置可以处理所有异常,那就更好了。这很简单,文档中也有说明。我用一个创建更复杂条件的例子更新了答案。@Andreas过去的情况是,他们的行为不同。看起来Ruby 2.0可能已经改变了这一点,但旧习惯很难改变。
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