2

我有一个表单,用户可以在其中编辑用户模型和照片模型中的属性。用户模型有很多照片。

当用户提交表单时,参数将有,

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

current_user.update_attributes(params[:user])在控制器上做了一个。

一切正常。但是没有对该操作进行授权。从而留下一个安全漏洞。用户可以通过更改表单帖子中传递的 ID(在 photo_attribtues 中)来修改他的任何照片。

如何检查当前用户是否有权(即他是否是所有者)使用 CanCan 更改 photo_attributes 中指定的照片。

注意:photos_attributes 是可选的。参数可能包含也可能不包含 photos_attributes。如果 params[:user] 中没有 photos_attributes,解决方案应该不会失败

4

3 回答 3

-1

简短的回答:CanCan 无法做到(通过可行的努力)。

长答案:从 CanCan 的角度来看,您只是在处理User碰巧具有名为photos_attributes. CanCan 必须挂钩到 ActiveRecord 的实现,accepts_nested_attributes_for以便将引用的关联范围限定为,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 回答