限制用户更新某些字段但允许后端编辑它们
Restrict users from updating certain fields but allow backend to edit them
我在用户模型中存储了一些字段,这些字段不应由用户自己编辑,而应仅由后端更新。所以我在 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 仪表板手动更新该字段,但它抛出了错误。我如何确保只有用户不允许编辑此字段,而仪表板或后端可以这样做(显然在使用主密钥时)。
这里有两个因素在起作用。首先,查看每个对象的访问控制 (ACL)。这些通常用于确定权限。但是,由于您有一个 "beforeSave" 函数,因此也会考虑这一点。即使在仪表板或后端所做的更改也会触发 beforeSave 函数。
我的建议是从用户 table 中删除用户不应更改的属性,并将它们存储在自定义 table 中,并带有指向它们所属的用户对象的指针。
原来 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();
});
我认为您需要创建一个带有私有字段的新 class。
我在用户模型中存储了一些字段,这些字段不应由用户自己编辑,而应仅由后端更新。所以我在 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 仪表板手动更新该字段,但它抛出了错误。我如何确保只有用户不允许编辑此字段,而仪表板或后端可以这样做(显然在使用主密钥时)。
这里有两个因素在起作用。首先,查看每个对象的访问控制 (ACL)。这些通常用于确定权限。但是,由于您有一个 "beforeSave" 函数,因此也会考虑这一点。即使在仪表板或后端所做的更改也会触发 beforeSave 函数。
我的建议是从用户 table 中删除用户不应更改的属性,并将它们存储在自定义 table 中,并带有指向它们所属的用户对象的指针。
原来 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();
});
我认为您需要创建一个带有私有字段的新 class。