2015-03-13 99 views
4

我在用戶模型中存儲了永遠不應該由用戶自己編輯的一些字段,而應該僅通過後端進行更新。所以我做beforeSave驗證:限制用戶更新某些字段,但允許後端編輯它們

// import all models 
var Models = require('cloud/models/index'); 

// Models.User is a subclass of Parse.User 
Parse.Cloud.beforeSave(Models.User, function (request, response) { 
    var user = request.object; 

    // prevent numberOfApples from being modified on clients 
    if(user.existed()) { 
     if(user.dirty('numberOfApples')) { 
      response.error('User is not allowed to modify numberOfApples.'); 
      return; 
     } 
    } 

    response.success(); 
}); 

所以我檢查模式之前就已經存在,所以這個東西不註冊時觸發,這是非常重要的。但後來我嘗試從Parse儀表板手動更新該字段,並引發錯誤。我如何確保只有用戶不允許編輯此字段,而儀表板或後端可以這樣做(顯然,使用主密鑰時)。

回答

3

原來Request.master是這裏的路。我允許在使用主密鑰時更改鎖定的字段。

例子:

Parse.Cloud.beforeSave(Models.User, function (request, response) { 
    var user = request.object; 

    // prevent system managed fields from being modified on clients 
    if(user.existed()) { 
     // we can change those fields when using master key. 
     if(!request.master) { 
      var privateFields = [ 'gold', 'skillLevel', 'weaponCount' ]; 
      for(var i = 0, c = privateFields.length; i < c; i++) { 
       var field = privateFields[i]; 

       if(user.dirty(field)) { 
        response.error('User is not allowed to modify ' + field + '.'); 
        return; 
       } 
      } 
     } 
    } 

    response.success(); 
}); 
+0

你可以分享你的解決方案代碼 – xybrek 2017-04-24 10:06:42

+0

@xybrek當然,我已經更新了我的答案。我不知道爲什麼我有'user.existed()'檢查,但在我的情況下'用戶'只能由後端創建。 – Andy 2017-04-24 11:48:32

+1

感謝您的回答 – xybrek 2017-04-24 12:05:10

1

這裏有兩個因素。首先,看看您擁有的每個對象的訪問控制(ACL)。這些通常用於確定權限。但是,由於您具有「beforeSave」功能,因此也會考慮到這一點。即使在儀表板或後端進行的更改也會觸發beforeSave函數。

我的建議是從用戶表中刪除用戶不應該更改的屬性,並將它們存儲在自定義表中,並將指針返回到它們所屬的用戶對象。

+0

ACL被設置爲僅由該用戶自己公開讀寫。如果我只能檢查是否使用masterKey觸發了操作,那麼我認爲這應該足以放寬對該字段的限制。 – Andy 2015-03-13 16:01:17

0

我認爲你需要創建一個私有字段一個新的類。

+0

這是建議如下。但我不必因爲'request.master'可以告訴我請求是否使用主密鑰運行,那麼我可以忽略鎖定字段的驗證。 – Andy 2015-03-14 11:00:24

相關問題