ruby-on-rails - ActiveAdmin + CanCanCan 错误与 : protected method `authorize!' called for <Every ActiveAdmin Controller>

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

我在让 ActiveAdmin 与 CanCanCan 一起工作时遇到了一些麻烦。我在 Rails 4 应用程序中使用 CanCanCan 版本 1.9.2 和 ActiveAdmin 版本 1.0.0.pre。在设置我的能力类并通过添加 load_and_authorize_resource 在我的应用程序的其余部分中启用授权检查之后和 check_authorization到我的 ApplicationController,我得到了错误
protected method 'authorize!' called for #<Activeadmin::<SomeControler>> (NoMethodError)
经过一番搜索,我遇到了this这个 GitHub 问题看起来与我遇到的问题一模一样。但是,该解决方案对我根本不起作用。在 config/initializers/active_admin.rb 我有,除其他外: ... config.authorization_adapter = ActiveAdmin::CanCanAdapter ... 我还确保我没有引用 controller.authorize_resource在任何 ActiveAdmin Controller 中,但我仍然得到 protected method authorize! ...当我尝试从我的集成测试访问任何 ActiveAdmin 资源时出错。

经过更多的尝试和错误以及更多的搜索,我发现调用 load_and_authorize_resource不推荐从 ApplicationController 中设置 ActiveAdmin 的 authorization_adapter 为 CanCanAdapter,就像我在上面所做的那样,应该会在 ActiveAdmin 中自动启用 CanCanCan 的授权检查,但是 check_authorization失败,因为在 load_and_authorize_resource 时资源未被授权给每个 ActiveAdmin Controller 从 ApplicationController 中删除。

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

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

最佳答案

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

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

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

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

关于ruby-on-rails - ActiveAdmin + CanCanCan 错误与 : protected method `authorize!' called for <Every ActiveAdmin Controller>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26225673/

相关文章:

ruby-on-rails - 哪些 Ruby gem 支持 Facebook API?

ruby-on-rails - Rails 4 image-path、image-url 和 asset-url 不再在 SCSS 文件中工作

ruby-on-rails - rails_admin gem 破坏了 Rails 4.1 中引入的枚举属性

ruby-on-rails - 使用Bootstrap调整ActiveAdmin的外观

ruby-on-rails - 事件管理员多选过滤器

ruby-on-rails - Rufus cron 调度在 jetty 服务器上不起作用

ruby-on-rails - ActiveRecord 匿名范围

ruby-on-rails - 动态计划在 resque fork 新流程时丢失

ruby-on-rails - Rails3 事件管理员 : How to display only Open status records when first click on Shipments tag?

ruby-on-rails - 使用 LDAP 进行 Rails 身份验证