1

在我的网站上,客户可以创建一些组和产品。每个产品都是belongs_to group。每个用户都可以创建和更新组,但仅限于他们自己创建的组。我正在使用 CanCan gem 来限制权限,效果很好,但我遇到了问题:

如果我在创建产品时授予用户创建组的权限,如下所示:(简化示例)查看:

= form_for @product
 = f.fields_for :group do |builder|
   = builder.label 'Group name'
   = builder.text_field :group

模型:

class Product < ActiveRecord::Base
  belongs_to :group
  attr_accessible :group_attributes
  accepts_nested_attributes_for :group
end

class Gift < ActiveRecord::Base
  has_many :products
end

能力:

cannot :manage, :all
can :manage, Product, group_id: user.group_id
can :manage, Group, user_group_id: user.group_id

因此,用户只能对他创建的内容(或由他的用户组中的任何人创建的内容执行任何操作,但忘记这一点——在我的示例中,每个 user_group 一个用户)

产品和组工作正常,限制访问。问题在于嵌套资源的安全性。在 ProductsController 我打电话

load_and_authorize_resource only: [:index, :show, :new, :destroy, :edit, :update]
authorize_resource only: [:create] #do some extra actions before authorize & save

因此,当我尝试更新任何组时,即使它不属于用户 - 它也会更新。好的,我需要加载和授权 Group 资源。但

load_and_authorize_resource only: [:index, :show, :new, :destroy, :edit, :update]
authorize_resource only: [:create]
load_and_authorize_resource :gift

或者

load_and_authorize_resource only: [:index, :show, :new, :destroy, :edit, :update]
authorize_resource only: [:create]
load_and_authorize_resource :gift, through: :product

不给结果。

尝试使用参数时,我发现允许在具有任何参数的模型上读取允许通过嵌套对象进行完全访问。例如,

can :read , Group, group_id: -1

我可以通过与嵌套属性关联来做任何事情,例如更新。此外,我尝试用其他方式解决我的问题——找到如何创建一个新组,如果它具有嵌套属性——这不是一个好方法,但它会阻止黑客。但是accept_nested_attributes只有参数update_only,没有create_only,所以,我决定在这里问。我哪里错了?

4

0 回答 0