这是自推出指针权限以来的一个错误,这实际上使它们无用。我的印象是,他们构建这个的想法是让开发人员一次性保护现有模式,但你当然需要它来为将来的创建工作。
一种解决方法是结合旧的类级别权限和每行 ACL,同时注意不要禁用数据浏览器。假设您有“Puppy”和“Cat”类,并且都有一个名为“owner”的字段。
- 在您的数据浏览器中,对于每个需要拥有所有者字段的类,您将其 Puppy 和 Cat 的类级别权限分别设置为:
公开 - 读取:是或否,取决于您的用例,写入:是
为“所有者”添加指针权限 - 读取:是,写入:是(现在可以跳过,见下文)
然后在您的 cloud/main.js 中,您可以使用以下内容作为起点(下面我经常将其称为“类型”,抱歉)。
当 Parse 修复创建问题时,您删除公共写入类级别权限(上),保留指针权限,并去掉下面的解决方法代码。
--
var validateAndUpdateOwnerWritePerms = function(request){
var object = request.object;
var error = null;
var owner = object.get('owner');
if (!Parse.User.current()) {
error = 'User session required to create or modify object.';
} else if (!owner) {
error = 'Owner expected, but not found.';
} else if (owner && owner.id != Parse.User.current().id && !object.existed()) {
error = 'User session must match the owner field in the new object.';
}
if (request.master) {
error = null;
}
if (error) {
return error;
}
if (object.existed()) {
return null;
}
var acl = new Parse.ACL();
acl.setReadAccess(owner, true);
acl.setWriteAccess(owner, true);
object.setACL(acl);
return null;
}
// Wrapper that makes beforeSave, beforeDelete, etc. respect master-key calls.
// If you use one of those hooks directly, your tests or admin
// console may not work.
var adminWriteHook = function(cloudHook, dataType, callback) {
cloudHook(dataType, function(request, response) {
if (request.master) {
Parse.Cloud.useMasterKey();
} else {
var noUserAllowed = false;
if (cloudHook == Parse.Cloud.beforeSave &&
(dataType == Parse.Installation || dataType == Parse.User)) {
noUserAllowed = true;
}
if (!noUserAllowed && !Parse.User.current()) {
response.error('Neither user session, nor master key was found.');
return null;
}
}
return callback(request, response);
});
};
// Set hooks for permission checks to run on delete and save.
var beforeOwnedTypeWriteHook = function(type) {
var callback = function (request, response) {
var error = validateAndUpdateOwnerWritePerms(request);
if (error) {
response.error(error);
return;
}
response.success();
};
return adminWriteHook(Parse.Cloud.beforeSave, type, callback);
return adminWriteHook(Parse.Cloud.beforeDelete, type, callback);
};
beforeOwnedTypeWriteHook('Puppy');
beforeOwnedTypeWriteHook('Cat');