5

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

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

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

经过更多的尝试和错误以及更多的搜索,我发现load_and_authorize_resource不建议从 ApplicationController 调用,并且像我上面所做的那样将 ActiveAdmin 的 authorization_adapter 设置为 CanCanAdapter 应该会自动在 ActiveAdmin 中启用 CanCanCan 的授权检查,但check_authorization由于资源未被授权而失败ActiveAdmin 控制器何时load_and_authorize_resource从 ApplicationController 中删除。

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

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

4

2 回答 2

6

在挖掘代码之后,我已经弄清楚发生了什么。ActiveAdmin 和它的 CanCanAdapter 还不兼容 CanCanCan 的check_authorization方法。该方法依赖于@_authorized通过授权方法在控制器上设置的实例变量,但 ActiveAdmin 的授权不会设置此变量。因此,即使 ActiveAdmin 正在执行授权,也check_authorization总是会失败,因为 ActiveAdmin 没有设置此实例变量。我已经报告了这个问题,但目前的解决方法是添加一个匹配所有 ActiveAdmin 控制器的unless:子句。check_authorization这将停止check_authorization为这些控制器运行,但是,只要启用 CanCanAdapter,ActiveAdmin 在响应资源之前仍会执行正确的授权。

这是我添加到我的 ApplicationController 的解决方法,直到问题得到解决,如果它曾经是:

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

  def activeadmin_resource?
    self.class.ancestors.include? ActiveAdmin::BaseController
  end
end
于 2014-10-08T00:47:43.883 回答
3

这不再适用于 Rails 5。

于 2018-11-12T18:53:48.173 回答