在控制器中嵌套继承资源的Cancan能力



我在控制器中继承了资源,我使用cancan进行授权。然而,我有一个问题,写作所需的能力。

我可以用两种方式显示特定的顺序:

/profile/123/orders/321
/store/456/orders/321
在控制器:

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

角色是:user (has_one:profile in Model)和manager (has_one:store in Model)

要求(用文字来说)是:

  • Manager可以在属于他的上下文中显示订单商店。
  • Manager不能在任何用户的上下文中显示订单配置文件(应拒绝访问)
  • 用户可以在中显示订单他的个人资料的上下文
  • 用户不能在任何上下文中显示订单存储(拒绝)

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

如果你有权利在你的能力。Rb文件用于配置文件和存储,然后您也可以授权父文件。例如:

load_and_authorize_resource :profile
load_and_authorize_resource :store
load_and_authorize_resource :order

或者你可以按照CanCan wiki:

中描述的那样做

多态关联

假设任务可以通过多态关联分配给Project或Event。数组可以传入: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

最新更新