8

メイン アプリにエンジンをマウントしており、そのエンジン内の特定のコントローラーとアクションを保護したいと考えています。

エンジンには以下が搭載されています。

mount SomeEngine::Engine => '/some_engine'

Devise/CanCan は、メイン アプリの残りのコントローラーとアクションで動作していますが、他に何もせずに実行すると、次のエラーが発生します。

This action failed the check_authorization because it does not authorize_resource. Add skip_authorization_check to bypass this check.

そこで、デコレーター アプローチを使用してメイン アプリからエンジン コントローラーを開き、以下を追加します。

load_and_authorize_resource

次に、次のエラーが表示されます。

No route matches {:action=>"new", :controller=>"devise/sessions"}

以下を使用して動作させることができますが、ロールを実装しようとすると扱いにくくなります。

authenticate :administrator do
  mount SomeEngine::Engine => '/some_engine'
end

不格好とは、エンジンにアクセスできるロールごとに、routes.rb ファイルで上記のコード ブロックを再現する必要があることを意味します...私が知らないロールで認証を使用する別の方法がない限り? ??

可能であれば、コントローラーで通常の Devise/CanCan 承認/認証アプローチを使用したいと思います。しかし、エンジンがメイン アプリの Devise コントローラーにアクセスする方法を認識していないため、"no route match" エラーが発生すると思います。しかし、メインアプリからこれを回避するにはどうすればよいですか?

ミックスにもう 1 つ問題を投げかけるには...エンジンには、すべてのユーザーに公開したい特定のコントローラー/アクションが 1 つあります。ここまでは、routes.rb ファイルの認証コード ブロックの前にこれを追加しました。

match '/some_engine' => 'some_engine/some_controller#public_action'

それは機能します...しかし、routes.rbのブロックを含むこの行は、何か間違っているようです。また、ロールを適切に実装することもできません。

4

1 に答える 1

8

メインアプリからdeviseとcancanを使用するためのアプリケーションコントローラーを継承できます。

module SomeEngine
  class ApplicationController < ::ApplicationController    
    before_filter :merge_abilities

    private

    def merge_abilities
      current_ability.merge(SomeEngine::Ability.new(current_user))                                                     
    end
  end
end                                                                                                                     

この後、独自の作成によってエンジンの能力を作成できます。

module SomeEngine
  class Ability
    include ::CanCan::Ability

    def initialize(user)
      return if user.nil?

      can :manage, SomeModel
    end
  end
end

SomeModel( SomeEngine::SomeModel) はSomeEngineエンジンでのモデルです。

リソース コントローラでは、リソースのクラス名を指定する必要があります。

load_and_authorize_resource class: SomeEngine::SomeModel

main_app.MAIN_APP_PATHSまた、エンジンで使用する場合は、ルート ヘルパーをメイン アプリケーション レイアウトで変更することを忘れないでください。

于 2012-09-01T09:29:33.860 に答える