5

ActiveAdmin を CanCanCan と連携させるのに問題があります。Rails 4 アプリで CanCanCan バージョン 1.9.2 と ActiveAdmin バージョン 1.0.0.pre を使用しています。アビリティ クラスをセットアップし、ApplicationController にload_and_authorize_resourceとを追加してアプリの残りの部分で承認チェックを有効check_authorizationにすると、エラーが発生します。

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

いくつか検索した後、私が抱えている問題とまったく同じように見えるこのGitHubの問題に遭遇しました。ただし、解決策はまったく機能しません。config/initializers/active_admin.rb には、特に次のようなもの があります。 ActiveAdmin コントローラーに ... config.authorization_adapter = ActiveAdmin::CanCanAdapter ... 参照がないことも確認しましたが、統合テストから ActiveAdmin リソースにアクセスしようとするとエラーが発生します。controller.authorize_resourceprotected method authorize! ...

試行錯誤と検索を重ねた結果load_and_authorize_resource、ApplicationController からの呼び出しは推奨されないことがわかりました。また、上記のように ActiveAdmin の authorization_adapter を CanCanAdapter に設定すると、ActiveAdmin で CanCanCan の承認チェックが自動的に有効になるはずcheck_authorizationですが、リソースが毎回承認されていないために失敗することがわかりました。 ApplicationController から削除されたときの ActiveAdmin コントローラーload_and_authorize_resource

では、ActiveAdmin コントローラに対して CanCanCan の認証チェックを有効にする正しい方法は何ですか? 管理者以外のユーザーが ActiveAdmin リソースにアクセスできないようにするには、CanCanCan と ActiveAdmin をどのように統合すればよいですか?

この質問も ActiveAdmin メーリング リストに投稿しましたが、回答がありませんでした。どんな助けでも大歓迎です。

4

2 に答える 2

6

コードを掘り下げた後、何が起こっているのかを理解しました。ActiveAdmin とその CanCanAdapter は、まだ CanCanCan のcheck_authorizationメソッドと互換性がありません。このメソッドは、認可メソッドによってコントローラに設定されているインスタンス変数に依存してい@_authorizedますが、ActiveAdmin の認可ではこの変数は設定されません。そのため、ActiveAdmin が承認を実行していても、ActiveAdmincheck_authorizationがこのインスタンス変数を設定していないため、常に失敗します。問題を報告しましたが、現時点での回避策は、すべての ActiveAdmin コントローラーに一致するunless:句をに追加することです。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
于 2014-10-08T00:47:43.883 に答える