【发布时间】:2018-09-14 18:20:11
【问题描述】:
我试图编写一个规则,如果文档的 id 不存在,则创建一个新文档。我的对象是:
Message message = new Message(userId, title, messageBody, timestamp);
我正在使用WriteBatch 创建一个新文档并更新它:
mWriteBatch.set(mMessageRef.document(messageId), message);
mWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);
在浏览了文档和这个网站后,我发现如果我使用create 方法,它只能是allows to write the data if it doesn't exist。
所以我创建了一个安全规则,例如:
match /messages/{message} {
allow read;
allow create: if isSignedIn();
allow update, delete: if isSignedIn();
}
isSignedIn() 只是一个包含request.auth != null 的方法。此规则失败并覆盖数据。现在我尝试了:
match /messages/{message} {
allow read;
allow create: if request.resource.id != message;
allow update, delete: if isSignedIn();
}
这一次它也覆盖了数据而不是显示错误。
我在这里做错了什么?任何帮助表示赞赏。
更新: 正如 José David Aroesti 在 comments 中所说,我必须将其更改为 exists 并删除 update 和 delete 才能正常工作并从应用程序中删除反映它应该做什么。但那我怎么update 和delete 一个文件呢?
例如,当我在模拟器中使用以下规则时,两者都按预期执行,但当我从设备上对其进行测试时,即使它存在,我也始终能够创建一个文档:
allow create: if !exists(/databases/$(database)/documents/messages/$(message));
allow update: if get(/databases/$(database)/documents/messages/$(message)).data.timestamp
< request.resource.data.timestamp;
有可能吗?
【问题讨论】:
-
如果有未指定
write或update应该是不可能覆盖的。 -
@creativecreator 或者可能没有更新问题,我还包括更新和删除。
标签: firebase google-cloud-firestore firebase-security