【问题标题】:ActiveAdmin + CanCanCan errors with : protected method `authorize!' called for <Every ActiveAdmin Controller>ActiveAdmin + CanCanCan 错误:受保护的方法“授权!”要求 <每个 ActiveAdmin 控制器>
【发布时间】:2014-10-06 22:10:56
【问题描述】:

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

protected method 'authorize!' called for #&lt;Activeadmin::&lt;SomeControler&gt;&gt; (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 应该会自动在 ActiveAdmin 中启用 CanCanCan 的授权检查,但是 check_authorization失败,因为当从 ApplicationController 中删除 load_and_authorize_resource 时,资源未被授权给每个 ActiveAdmin 控制器。

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

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

【问题讨论】:

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


    【解决方案1】:

    在深入研究代码后,我弄清楚了发生了什么。 ActiveAdmin 及其 CanCanAdapter 尚不兼容 CanCanCan 的 check_authorization 方法。该方法依赖于由授权方法在控制器上设置的@_authorized 实例变量,但 ActiveAdmin 的授权不会设置此变量。因此,即使 ActiveAdmin 正在执行授权,check_authorization 总是会失败,因为 ActiveAdmin 没有设置此实例变量。我已经报告了这个问题,但目前的解决方法是在check_authorization 中添加一个匹配所有 ActiveAdmin 控制器的unless: 子句。这会阻止 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
    

    【讨论】:

    • 这对我来说效果很好,并且可以从 ActiveAdmin 界面中删除未经授权的功能。从 ApplicationController 中删除 load_and_authorize_resource 并添加此处建议的代码就可以了。
    • 谢谢!当我不得不从 Rails 3.2 (ActiveAdmin 0.5.1) 升级到 Rails 5.0 (ActiveAdmin 1.0.0pre4) 时,我遇到了同样的问题。我在 ActiveAdmin 的问题跟踪器中报告了这个问题:github.com/activeadmin/activeadmin/issues/4599
    【解决方案2】:

    这不再适用于 Rails 5。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多