Parse platform 限制用户更新某些字段,但允许后端编辑这些字段

Parse platform 限制用户更新某些字段,但允许后端编辑这些字段,parse-platform,parse-cloud-code,Parse Platform,Parse Cloud Code,我在用户模型上存储了一些字段,这些字段永远不应该由用户自己编辑,而应该只由后端更新。因此,我在保存之前进行验证: // 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 = re

我在用户模型上存储了一些字段,这些字段永远不应该由用户自己编辑,而应该只由后端更新。因此,我在保存之前进行验证:

// 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 dashboard手动更新该字段,它抛出了错误。如何确保只有用户不允许编辑此字段,而仪表板或后端可以这样做(显然是在使用主密钥时)。

这里有两个因素。首先,看看您为每个对象提供的访问控制(ACL)。它们通常用于确定权限。但是,由于您有一个“beforeSave”函数,因此也将考虑该函数。即使在仪表板或后端上所做的更改也会触发beforeSave功能


我的建议是从用户表中删除用户不应更改的属性,并将它们存储在自定义表中,并使用指向它们所属的用户对象的指针。

结果是
请求。这里的方法是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();
});
Parse.Cloud.beforeSave(Models.User,函数(请求,响应){
var user=request.object;
//防止在客户端上修改系统管理的字段
if(user.existed()){
//我们可以在使用主密钥时更改这些字段。
如果(!request.master){
var privateFields=[‘黄金’、‘技能等级’、‘武器计数’];
for(var i=0,c=privateFields.length;i
我认为您需要创建一个带有私有字段的新类。

ACL由该用户自己设置为公共只读写。如果我只能检查是否使用masterKey触发了操作,我相信在这种情况下,这应该足以放松对字段的限制。但我不必这样做,因为
request.master
可以告诉我请求是否使用主密钥运行,然后我可以忽略锁定字段的验证。@xybrek当然,我已经更新了答案。我不知道为什么我有
user.existed()
检查,但在我的情况下,
user
只能由后端创建。谢谢你的回答