0

我继承了在我的控制器中工作的资源,并且我使用 cancan 进行授权。但是,我在编写所需的能力时遇到了问题。

我可以通过 2 种方式显示特定顺序:

/profile/123/orders/321
/store/456/orders/321

在控制器中:

class OrdersController < ApplicationController
  inherit_resources 
  belongs_to :profile, :store, :optional => true
  load_and_authorize_resource
  ...
end

角色是:用户(模型中的has_one:profile)和经理(模型中的has_one:store)

要求(用文字表示)是:

  • 经理可以在(属于)他的商店的上下文中显示订单。
  • 经理无法在任何用户配置文件的上下文中显示订单(应拒绝访问)
  • 用户可以在其个人资料的上下文中显示订单
  • 用户无法在任何商店的上下文中显示订单(被拒绝)

我无法满足这些要求,也许我应该以特殊方式或实际上以两种方式加载资源?直觉告诉我,在这两种情况下,对订单的访问都应该基于对父资源的访问。谢谢你的帮助。

4

1 回答 1

0

如果您在您的能力.rb 文件中拥有配置文件和存储的权限,那么您也可以授权父级。即是这样的:

load_and_authorize_resource :profile
load_and_authorize_resource :store
load_and_authorize_resource :order

或者您可以按照 CanCan wiki 中的说明进行操作:

多态关联

假设可以通过多态关联将任务分配给项目或事件。可以将数组传递给 :through 选项,它将使用它找到的第一个。

 load_resource :project
 load_resource :event
 load_and_authorize_resource :task, :through => [:project, :event]

在这里,它将检查@project 和@event 变量,并通过存在的任何一个来获取任务。请注意,这只是加载父模型,如果要授权父模型,则需要通过 before_filter 来完成,因为涉及特殊逻辑。

 before_filter :authorize_parent
 private
 def authorize_parent
   authorize! :read, (@event || @project)
 end
于 2012-01-03T12:54:47.200 回答