我在User模型上存储了一些永远不应由用户自己编辑的字段,而应仅由后端更新。所以我在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仪表板手动更新该字段,它会引发错误。如何确保只允许用户编辑此字段,而仪表板或后端可以这样做(显然当使用主密钥时)。
答案 0 :(得分:4)
结果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();
});
答案 1 :(得分:1)
这里有两个因素在起作用。首先,查看每个对象的访问控制(ACL)。这些通常用于确定权限。但是,由于您具有“beforeSave”功能,因此也会考虑这一点。即使在仪表板或后端上进行的更改也会触发beforeSave功能。
我的建议是从User表中删除用户不应更改的属性,并将它们存储在自定义表中,并使用指针返回其所属的User对象。
答案 2 :(得分:0)
我认为您需要创建一个包含私有字段的新类。