メイン アプリにエンジンをマウントしており、そのエンジン内の特定のコントローラーとアクションを保護したいと考えています。
エンジンには以下が搭載されています。
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のブロックを含むこの行は、何か間違っているようです。また、ロールを適切に実装することもできません。