0

我需要限制用户只能通过“supplier_id”访问他们的发货清单项目。我知道我可以使用 'accessible_by' 添加一个 'where' 子句。但是如果我忘记将accessible_by 范围添加到我的查询中,在下面的控制器中,在操作索引中,用户可以读取任何列表。

class SupplierShippingListsController < ApplicationController

    load_and_authorize_resource
    def index
        @shipping_lists = SupplierShippingList.where(:supplier_id => params[:supplier_id])
        authorize! :read, SupplierShippingList
    end

end

我首先定义了这个规则,将根据我的哈希检查跳跃实例,但它没有,好像 :supplier_id 毫无意义。

can :read, SupplierShippingList, :supplier_id => user.company_id

所以我尝试了一个带有随机值的块,使其无法通过授权,但用户仍然可以访问该操作。

can :read, SupplierShippingList do |list|
    list.supplier_id == 17
end

有什么隐藏的东西要设置吗?

编辑

我也试过

authorize! :read, @shipping_lists

无济于事。

4

2 回答 2

1

由于您正在使用load_and_authorize_resource,因此您无需执行任何操作。在您的索引操作中,supplier_shipping_lists如果您使用的是can :read, SupplierShippingList, :supplier_id => user.company_id. 如果这不起作用,您是否有任何其他规则适用于SupplierShippingList

于 2013-03-31T22:33:52.020 回答
1

索引操作将忽略该块,因此您的第二个示例将不起作用。对于像这样相对简单的能力,你最好的选择是使用像你的第一个例子一样的条件哈希。但load_and_authorize_resource会自动@supplier_shipping_lists为您加载。如图所示,您的索引操作将覆盖变量并使“加载和授权资源”的“加载”部分毫无意义。您应该删除 index 操作并让 CanCan 为您完成加载。如果您不覆盖实例变量,则只要使用条件散列,您就应该看到您期望的结果。

此外,您也不需要手动调用authorize!。那是 '授权' 的一部分load_and_authorize_resource。您只需要让 CanCan 完成这项工作。当您输入索引操作时,实例变量要么已经初始化,但如果您无权查看任何列表,则该实例变量将为空

于 2013-03-31T23:24:28.367 回答