2013-04-13 52 views
1

我有一個表單,在這個表單中用戶可以在User模型和Photo模型中編輯它們的屬性。用戶模型有很多照片。Cancan對嵌套屬性的授權操作

當用戶提交表單時,PARAMS都會有,

: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。 [:用戶]

回答

-1

我假設你定義你的路由如下:如果在PARAMS沒有photos_attributes的解決方案應該不會失敗

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

+0

問題是關於嵌套屬性模型,而不是嵌套的資源。 – hmans

-1

簡短的回答:這個不能做(與可行的努力)與慘慘。

很長的答案:從CanCan的角度來看,您只能處理User資源,該資源碰巧有一個名爲photos_attributes的屬性。 CanCan將不得不掛鉤到ActiveRecord的accepts_nested_attributes_for的實現中,以便在控制器上下文中將參考關聯範圍限定爲Photo.accessible_by(current_ability)而不僅僅是Photo。醜陋!

如果您認真對待授權並且可以在沒有accepts_nested_attributes_for的附加舒適度的情況下生活,唯一可行的解​​決方案可能是您自己處理額外的模型(即在您的控制器代碼中)。

0

這是一個老問題,但我遇到了同樣的問題

根據cancan維基(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