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