ada*_*ort 10 javascript security parse-platform
我已经完成了本演练的每一步,但是当我尝试创建一个新行时,我得到了403:
代码:119
消息:"不允许此用户对消息执行创建操作.您可以在数据浏览器中更改此设置."
我的代码:
Messages = Parse.Object.extend("Messages")
var message = new Messages();
message.set("sender", Parse.User.current());
message.set("receiver", *anotherUser*);
message.set("subject", "foo")
message.set("body", "bar")
message.save()
.then(
function(message){
console.log("success!")
},function(error){
console.log("error: ", error);
});
Run Code Online (Sandbox Code Playgroud)
看起来其他人在Google群组中发布了相同的问题.我们缺少什么?
小智 6
自从Pointer Permissions推出以来,这一直是一个错误,这有效地使它们无用.我的印象是他们建立了这个想法,让开发人员一次性保护现有的模式,但当然你需要它来为将来的创作工作.
一种解决方法是将较旧的类级别权限与每行ACL相结合,同时小心不要禁用数据浏览器.假设您有"Puppy"和"Cat"类,并且都有一个名为"owner"的字段.
公开 - 阅读:是或否,取决于您的使用案例,写:是的
为"所有者"添加指针许可 - 阅读:是,写:是(现在可以跳过此,见下文)
然后在你的cloud/main.js中,你可以使用以下作为起点(我经常在下面称之为"类型",抱歉).
当Parse修复了创建问题时,删除了Public Write Class Level权限(上面),保留指针权限,并删除下面的变通方法代码.
-
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');
Run Code Online (Sandbox Code Playgroud)