2014-10-06 72 views
4

我有一些麻煩讓ActiveAdmin與CanCanCan一起使用。我在Rails 4應用程序中使用CanCanCan版本1.9.2和ActiveAdmin版本1.0.0.pre。建立自己的能力一流,並通過添加load_and_authorize_resourcecheck_authorization我的ApplicationController使我的應用程序的其餘部分授權檢查後,我得到的錯誤ActiveAdmin + CanCanCan錯誤:protected方法`授權!'呼籲<每個ActiveAdmin控制器>

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

經過一番搜索,我碰到了this這個GitHub的問題是看起來完全像我遇到的問題。但是,該解決方案對我來說完全不起作用。在配置/初始化/ active_admin.rb我有,其中包括: ... config.authorization_adapter = ActiveAdmin::CanCanAdapter ... 我也確保我沒有在任何ActiveAdmin控制器controller.authorize_resource的引用,但我仍然遇到protected method authorize! ...錯誤,當我嘗試訪問任何ActiveAdmin資源我的集成測試。

一些更多的試驗和錯誤和更多的搜索後,我發現,從調用的ApplicationController load_and_authorize_resource不推薦,而且ActiveAdmin的authorization_adapter設置CanCanAdapter像我一樣上面應自動啓用ActiveAdmin CanCanCan的授權檢查,但check_authorization失敗,因爲當從ApplicationController中刪除load_and_authorize_resource時,資源未被授權用於每個ActiveAdmin控制器。

那麼,爲我的ActiveAdmin控制器啓用CanCanCan授權檢查的正確方法是什麼?我應該如何整合CanCanCan和ActiveAdmin,以便非管理員用戶無法訪問任何ActiveAdmin資源?

我還將this問題發佈到ActiveAdmin郵件列表,但沒有得到任何迴應。任何幫助將不勝感激。

回答

5

在仔細研究代碼之後,我已經知道發生了什麼。 ActiveAdmin和它的CanCanAdapter尚不兼容CanCanCan的check_authorization方法。該方法依賴於通過授權方法在控制器上設置的@_authorized實例變量,但ActiveAdmin的授權不會設置此變量。因此,即使ActiveAdmin執行授權,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

這是爲我工作很好,並移除ActiveAdmin接口擅自能力。從ApplicationController中刪除load_and_authorize_resource並添加這裏提供的代碼的竅門。 – jamesrward 2015-07-20 19:41:40

+1

謝謝!當我不得不從Rails 3.2(ActiveAdmin 0.5.1)升級到Rails 5.0(ActiveAdmin 1.0.0pre4)時,我遇到了同樣的問題。我在ActiveAdmin的問題跟蹤器中報告了此問題:https://github.com/activeadmin/activeadmin/issues/4599 – 2016-08-25 06:31:10

+0

完美地工作,謝謝! – cpursley 2016-12-14 17:56:51