732*_*732 4 ruby-on-rails activeadmin ruby-on-rails-4 cancancan
我在使用ActiveAdmin与CanCanCan合作时遇到了一些麻烦.我在Rails 4应用程序中使用CanCanCan版本1.9.2和ActiveAdmin版本1.0.0.pre.通过添加load_and_authorize_resource和check_authorization我的ApplicationController 设置我的能力类并在我的应用程序的其余部分启用授权检查后,我收到错误
protected method 'authorize!' called for #<Activeadmin::<SomeControler>> (NoMethodError)
经过一番搜索,我遇到了这个 GitHub问题,看起来和我遇到的问题完全一样.但是,解决方案对我来说根本不起作用.在config/initializers/active_admin.rb中,除其他外:
...
config.authorization_adapter = ActiveAdmin::CanCanAdapter
...
我还确保controller.authorize_resource在任何ActiveAdmin控制器中都没有引用,但是protected method authorize! ...当我尝试从集成测试中访问任何ActiveAdmin资源时仍然会收到错误.
经过一些试验和错误以及更多搜索后,我发现load_and_authorize_resource不建议从ApplicationController 调用,并且如上所述将ActiveAdmin的authorization_adapter设置为CanCanAdapter应该会自动在ActiveAdmin中启用CanCanCan的授权检查,但是check_authorization因为资源未被授权load_and_authorize_resource从ApplicationController中删除ActiveAdmin控制器.
那么启用CanCanCan对ActiveAdmin控制器的授权检查的正确方法是什么?我应该如何集成CanCanCan和ActiveAdmin,以便非管理员用户无法访问任何ActiveAdmin资源?
我还将此问题发布到ActiveAdmin邮件列表,但没有得到回复.任何帮助将不胜感激.
在深入研究代码后,我发现了正在发生的事情.ActiveAdmin和它的CanCanAdapter还不兼容CanCanCan的check_authorization方法.该方法依赖于@_authorized授权方法在控制器上设置的实例变量,但ActiveAdmin的授权不设置此变量.因此,即使ActiveAdmin IS执行授权,也check_authorization始终会失败,因为ActiveAdmin未设置此实例变量.我已经报告了这个问题,但现在的解决方法是添加一个匹配所有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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1715 次 |
| 最近记录: |