2

ユーザーが User モデルと Photo モデルの属性を編集できるフォームを使用しています。ユーザーモデルには多くの写真があります。

ユーザーがフォームを送信すると、params は次のようになります。

:user => { :name => "blah blah",
           :photos_attributes => {
                "1" => { "id" => 10, "description" => "Some description"}
           }
         }

current_user.update_attributes(params[:user])コントローラーでa を実行します。

すべてが正常に機能しています。ただし、アクションに対して行われる承認はありません。これにより、セキュリティ ホールが残ります。ユーザーは、フォーム投稿で (photo_attribtues で) 渡された ID を変更するだけで、自分の意志の写真を変更できます。

現在のユーザーが CanCan を使用して photo_attributes で指定された写真を変更する権限を持っているかどうか (つまり、彼が所有者であるかどうか) を確認するにはどうすればよいですか。

注: photos_attributes はオプションです。パラメータには、photos_attributes が含まれる場合と含まれない場合があります。params[:user] に photos_attributes がない場合、ソリューションは失敗しません。

4

3 に答える 3

-1

簡単な答え: これは CanCan では (実現可能な努力で) 行うことはできません。

User長い答え: CanCan の観点からは、たまたま という属性を持つリソースのみを扱っていますphotos_attributes。CanCan は、コントローラ コンテキストにあるときだけでなくaccepts_nested_attributes_for、参照される関連付けのスコープを設定するために、 ActiveRecord の実装にフックする必要があります。醜い!Photo.accessible_by(current_ability)Photo

承認に真剣に取り組んでおり、 の追加の快適さなしで生活できる場合accepts_nested_attributes_for、実行可能な唯一の実用的な解決策は、追加のモデルを自分で (つまり、コントローラー コードで) 処理することかもしれません。

于 2014-02-08T17:50:27.023 に答える
-1

それは古い質問ですが、私は同じ問題に遭遇しました

cancanwiki ( Defining Abilities ) によると、次のような条件のハッシュを使用することが可能です。

class Ability
  include CanCan::Ability

  def initialize(user)
    #...
    #other abilities
    #...

    # first we check user can only edit his profile (id: user.id)
    # then we check he can only edit his photos
    can :update, User, id: user.id, photos: { id: user.photos_ids }
  end
end
于 2014-05-12T08:52:28.203 に答える
-2

次のようにルートを定義したとします。

resources :users do
  resources :photos
end

その場合、ability.rbファイルで次のことができます。

def initialize(user)
  can :manage, Photos, :user_id => user.id
end

また、写真が正しいユーザーのものであることを確認する必要があります。

参照: https://github.com/ryanb/cancan/wiki/Nested-Resources

于 2013-05-27T16:22:20.883 に答える