我已经跟随this walkthrough的每一步,但是当我尝试创建一个新行时,我得到了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);
});
看起来其他人发布了the same issue in a google group。我们缺少什么?
答案 0 :(得分:16)
我已将此作为a bug提交给Parse(Facebook),他们回复说:
我们设法重现了这个问题,它似乎是一个有效的错误。我们将此分配给相应的团队。
问题解决后,我会更新此答案。 如果此问题影响了您,请订阅该错误,因为这有助于确定修复的优先顺序。
Facebook回复:
事实证明这实际上是设计上的。要创建对象,该类应具有公共创建权限
不幸的是,通过这个解决方案,我可以“从”任何其他用户创建一条消息(另一个用户设置为sender
)。这是不可接受的,无法使用恕我直言。
答案 1 :(得分:6)
自指针权限启动以来,这一直是一个错误,这有效地使它们变得毫无用处。我的印象是他们建立了这个想法,让开发人员一次性保护现有的模式,但当然你需要它来为将来的创作工作。
一种解决方法是将较旧的类级别权限与每行ACL相结合,同时小心不要禁用数据浏览器。让我们假设你有课程" Puppy"和#34; 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');
答案 2 :(得分:2)
不幸的是,Parse Pointer Permissions似乎无法按预期在Create
上运行。快速解决方案是允许Create
权限公开。然后确保创建记录的用户与sender
相同。因此,您需要在云代码中beforeSave
类的Messages
触发器中执行手动检查,如果检查失败,请拒绝正在创建的记录。