ActiveAdmin + CanCanCan错误:受保护的方法`authorize!&#39;要求<every activeadmin =“”controller =“”> </every>

时间:2014-10-06 22:10:56

标签: ruby-on-rails ruby-on-rails-4 activeadmin cancancan

我在使用ActiveAdmin与CanCanCan合作时遇到了一些麻烦。我在Rails 4应用程序中使用CanCanCan版本1.9.2和ActiveAdmin版本1.0.0.pre。通过向我的ApplicationController添加load_and_authorize_resourcecheck_authorization来设置我的能力类并在我的应用程序的其余部分启用授权检查后,我收到错误

protected method 'authorize!' called for #<Activeadmin::<SomeControler>> (NoMethodError)

经过一番搜索后,我遇到了this这个GitHub问题,看起来与我遇到的问题完全一样。但是,解决方案对我来说根本不起作用。在config / initializers / active_admin.rb中,我有以下内容: ... config.authorization_adapter = ActiveAdmin::CanCanAdapter ... 我还确保在任何ActiveAdmin控制器中都没有引用controller.authorize_resource,但当我尝试从集成测试中访问任何ActiveAdmin资源时仍然出现protected method authorize! ...错误。

经过一些试验和错误以及更多搜索,我发现不推荐从ApplicationController调用load_and_authorize_resource,并且像我上面那样将ActiveAdmin的authorization_adapter设置为CanCanAdapter会自动启用CanCanCan&#39;在ActiveAdmin中进行授权检查,但check_authorization失败,因为从ApplicationController中删除load_and_authorize_resource时,没有为每个ActiveAdmin控制器授权资源。

那么启用CanCanCan对ActiveAdmin控制器的授权检查的正确方法是什么?我应该如何集成CanCanCan和ActiveAdmin,以便非管理员用户无法访问任何ActiveAdmin资源?

我还向ActiveAdmin邮件列表发布了this个问题,但没有得到回复。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:5)

在深入研究代码后,我发现了正在发生的事情。 ActiveAdmin和它的CanCanAdapter尚未与CanCanCan的check_authorization方法兼容。该方法依赖于授权方法在控制器上设置的@_authorized实例变量,但ActiveAdmin的授权不设置此变量。因此,即使ActiveAdmin IS执行授权,check_authorization也始终失败,因为ActiveAdmin未设置此实例变量。我已经报告了这个问题,但现在的解决方法是向unless:添加一个匹配所有ActiveAdmin控制器的check_authorization子句。这会阻止check_authorization为这些控制器运行,但是,只要启用了CanCanAdapter,ActiveAdmin IS仍会在响应资源之前执行正确的授权。

这是我已经添加到ApplicationController的解决方法,直到问题得到修复,如果它将会是:

class ApplicationController < ActionController::Base
  ...
  check_authorization unless: :activeadmin_resource?
  ...
  private

  def activeadmin_resource?
    self.class.ancestors.include? ActiveAdmin::BaseController
  end
end

答案 1 :(得分:0)

这不再适用于Rails 5。