具有嵌套在控制器中的继承资源的Cancan功能

时间:2011-11-17 16:14:08

标签: ruby-on-rails nested cancan inherited-resources

我继承了在我的控制器中工作的资源,我使用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

角色是:用户(has_one:模型中的个人资料)和经理(has_one:存储在模型中)

要求(单词)是:

  • 经理可以在(属于)他的上下文中显示订单 存储。
  • 管理员无法在任何用户的上下文中显示订单 个人资料(应拒绝访问)
  • 用户可以显示订单 他的个人资料的背景
  • 用户无法在任何情况下显示订单 商店(被拒绝)

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

1 个答案:

答案 0 :(得分:0)

如果您拥有个人资料和商店的ability.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