受保护的方法’授权!’呼叫#< Activeadmin ::< SomeControler>> (NoMethodError)
经过一番搜索,我遇到了this这个GitHub问题,看起来和我遇到的问题完全一样.但是,解决方案对我来说根本不起作用.在config / initializers / active_admin.rb中,我有以下内容:
…
config.authorization_adapter = Activeadmin :: CanCanAdapter
…
我还确保在任何Activeadmin控制器中都没有对controller.authorize_resource的引用,但我仍然可以获得受保护的方法授权! …当我尝试从集成测试中访问任何Activeadmin资源时出错.
经过一些试验和错误以及更多搜索之后,我发现不建议从ApplicationController调用load_and_authorize_resource,并且如上所述将Activeadmin的authorization_adapter设置为CanCanAdapter应该会自动启用CanAdCanCanCan在Activeadmin中的授权检查,但check_authorization失败,因为资源未经授权从ApplicationController中删除load_and_authorize_resource时为每个Activeadmin控制器.
那么启用CanCanCan对Activeadmin控制器的授权检查的正确方法是什么?我应该如何集成CanCanCan和Activeadmin,以便非管理员用户无法访问任何Activeadmin资源?
我还向Activeadmin邮件列表发布了this问题,但没有得到回复.任何帮助将不胜感激.
解决方法 在深入研究代码后,我发现了正在发生的事情. Activeadmin和它的CanCanAdapter还不兼容CanCanCan的check_authorization方法.该方法依赖于授权方法在控制器上设置的@_authorized实例变量,但Activeadmin的授权不设置此变量.因此,即使Activeadmin IS执行授权,check_authorization也总是失败,因为Activeadmin没有设置此实例变量.我已经报告了这个问题,但现在的解决方法是在check_authorization中添加一个与所有Activeadmin控制器匹配的unless:子句.这会阻止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 endend总结
以上是内存溢出为你收集整理的ruby-on-rails – ActiveAdmin CanCanCan错误:受保护的方法`authorize!’呼吁全部内容,希望文章能够帮你解决ruby-on-rails – ActiveAdmin CanCanCan错误:受保护的方法`authorize!’呼吁所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)