簡體   English   中英

ActiveAdmin + CanCanCan錯誤:受保護的方法`authorize!'調用<Every ActiveAdmin Controller>

[英]ActiveAdmin + CanCanCan errors with : protected method `authorize!' called for <Every ActiveAdmin Controller>

我在使用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)

經過一番搜索,我遇到了這個 GitHub問題,看起來和我遇到的問題完全一樣。 但是,解決方案對我來說根本不起作用。 在config / initializers / active_admin.rb中我有以下內容: ... config.authorization_adapter = ActiveAdmin::CanCanAdapter ...我還確保在任何ActiveAdmin控制器中都沒有對controller.authorize_resource引用,但我仍然得到protected method authorize! ... protected method authorize! ...當我嘗試從集成測試中訪問任何ActiveAdmin資源時出錯。

經過一些試驗和錯誤以及更多搜索之后,我發現不建議從ApplicationController調用load_and_authorize_resource ,並且如上所述將ActiveAdmin的authorization_adapter設置為CanCanAdapter應該會自動啟用CanAdCanCanCan在ActiveAdmin中的授權檢查,但check_authorization失敗,因為資源未經授權每ActiveAdmin控制器時load_and_authorize_resource從ApplicationController中除去。

那么啟用CanCanCan對ActiveAdmin控制器的授權檢查的正確方法是什么? 我應該如何集成CanCanCan和ActiveAdmin,以便非管理員用戶無法訪問任何ActiveAdmin資源?

我還將問題發布到ActiveAdmin郵件列表,但沒有得到回復。 任何幫助將不勝感激。

在深入研究代碼后,我發現了正在發生的事情。 ActiveAdmin和它的CanCanAdapter還不兼容CanCanCan的check_authorization方法。 該方法依賴於授權方法在控制器上設置的@_authorized實例變量,但ActiveAdmin的授權不設置此變量。 因此,即使ActiveAdmin IS執行授權, check_authorization總是失敗,因為ActiveAdmin沒有設置此實例變量。 我已經報告了這個問題,但現在的解決方法是在check_authorization中添加一個與所有ActiveAdmin控制器匹配的unless:子句。 這會阻止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

這不再適用於Rails 5。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM