私のサイトでは、顧客はいくつかのグループと製品を作成できます。すべての製品が属しているグループです。すべてのユーザーはグループを作成および更新できますが、自分で作成したグループのみです。私は 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 ごとに 1 人のユーザーです)。
製品とグループは正常に機能しており、アクセスが制限されています。ネストされたリソースのセキュリティに問題があります。ProductsController で私が呼び出す
load_and_authorize_resource only: [:index, :show, :new, :destroy, :edit, :update]
authorize_resource only: [:create] #do some extra actions before authorize & save
したがって、グループを更新しようとすると、ユーザーに属していなくても更新されます。わかりました。グループ リソースを読み込んで承認する必要があります。しかし
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 がないので、ここで質問することにしました。どこが間違っていますか?