我的主应用程序安装了一个引擎,我想保护该引擎中的某些控制器和操作。
发动机安装有:
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 授权/身份验证方法。但我认为出现“无路由匹配”错误是因为引擎不知道如何访问主应用程序的设计控制器。但是我如何从主应用程序中解决这个问题?
再添加一个问题......引擎中有一个特定的控制器/动作,我确实想向所有用户公开。到目前为止,我刚刚在 routes.rb 文件中的验证代码块之前添加了这个。
match '/some_engine' => 'some_engine/some_controller#public_action'
它可以工作......但是这条线与 routes.rb 中的块似乎我做错了什么。而且它不允许我很好地实现角色。