轨道上的红宝石 - CanCan对load_and_authorize_resource的解释



我会知道load_and_authorize_resource在里面是如何工作的。我搜索了 github 页面链接并尝试取消,但我没有找到任何有用的东西。我只知道load_and_authorize_resource就像一个before_filter,它加载(以某种方式)我们在ability.rb中编写的能力

我会更清楚这怎么可能。我的意思是,我不想研究所有的宝石,但我只想看看cancan如何在控制器中加载资源的能力,以及load_and_authorize_resource是否真的是一种before_filter。

免责声明:为了简单起见,我故意省略了一些对简短的内部方法的调用。可以通过遵循方法定义等load_and_authorize_resource来获取完整的调用链。

如文档中所述,load_and_authorize_resource设置了一个before_filter...

# cancan/lib/cancan/controller_additions.rb
def load_and_authorize_resource(*args)
  cancan_resource_class.add_before_filter(self, :load_and_authorize_resource, *args)
end

。它调用两种方法:load_resourceauthorize_resource

# cancan/lib/cancan/controller_resource.rb
def load_and_authorize_resource
  load_resource
  authorize_resource
end

为了了解他们的行为,我们将仔细研究他们俩。

根据传递给控制器操作params哈希,load_resource决定是否应获取类的新实例(例如 Post.new )或基于params[:id] find特定实例(例如 Post.find(params[:id]) )。该实例(或 index 等操作的实例集合)被分配给控制器操作的相应实例变量。

# cancan/lib/cancan/controller_resource.rb
def load_resource
  unless skip?(:load)
    if load_instance?
      # here you have obtained your object, e.g. Post with id=5
      # and placed it into cancan resource_instance variable.
      # it has automatically set up @post instance variable for you
      # in your action
      self.resource_instance ||= load_resource_instance
    elsif load_collection?
      self.collection_instance ||= load_collection
    end
  end
end

后来,authorize_resource被召唤了。它的内部逻辑语法你应该很熟悉:手动检查能力看起来与此方法内部发生的情况相同。基本上,您获取在上一步获得的resource_instanceparams[:action]当前操作的名称,并检查是否可以访问给定对象的特定操作。

# cancan/lib/cancan/controller_resource.rb
def authorize_resource
  unless skip?(:authorize)
    # similar to what happens when you call authorize!(:show, @post)
    @controller.authorize!(authorization_action, resource_instance || resource_class_with_parent)
  end
end

只要在 before_filter 内部引发异常就会阻止执行控制器操作,未能在此处传递授权就会被重定向到应用程序的主 URL、显示 500 错误页面或您为CanCan::AccessDenied处理定义的任何行为。

另一方面,如果您成功通过了授权,则会执行您的操作代码。现在您可以访问实例变量(例如 @post ),这是CanCanload_resource步骤中建立的。

相关内容

  • 没有找到相关文章

最新更新