限制用户更新某些字段,但允许后端编辑它们

时间:2015-03-13 14:43:44

标签: parse-platform cloud-code

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

3 个答案:

答案 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)

我认为您需要创建一个包含私有字段的新类。