【问题标题】:Firestore create document if it doesn't exist security rule如果不存在安全规则,Firestore 创建文档
【发布时间】: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 并删除 updatedelete 才能正常工作并从应用程序中删除反映它应该做什么。但那我怎么updatedelete 一个文件呢?

例如,当我在模拟器中使用以下规则时,两者都按预期执行,但当我从设备上对其进行测试时,即使它存在,我也始终能够创建一个文档:

allow create: if !exists(/databases/$(database)/documents/messages/$(message));

allow update: if get(/databases/$(database)/documents/messages/$(message)).data.timestamp
        < request.resource.data.timestamp;

有可能吗?

【问题讨论】:

  • 如果有未指定writeupdate应该是不可能覆盖的。
  • @creativecreator 或者可能没有更新问题,我还包括更新和删除。

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

您可以使用exists()get() 内置函数来验证文档是否存在或访问文档以便读取其数据。

在这种情况下,一个例子是:

match /messages/{message} {
    allow read; 
    allow create: if !exists(/databases/$(database)/documents/messages/$(request.resource.id));
}

正如@creativecreatorormaybenot 建议的那样,您不应为updatedelete 指定allow 表达式,以免覆盖数据。

这里是文档的链接:

https://firebase.google.com/docs/firestore/security/rules-conditions#access_other_documents

https://firebase.google.com/docs/reference/rules/rules.firestore

【讨论】:

  • 谢谢。以前我正在与 request.resource.id 进行比较以获取方法。正如建议的那样,我删除了updatedelete 并看到了区别。但是现在我要如何更新或删除文档呢?有什么帮助吗?
猜你喜欢
  • 2020-06-19
  • 2019-08-26
  • 1970-01-01
  • 2019-02-16
  • 2019-09-27
  • 1970-01-01
  • 2019-03-03
  • 2019-02-01
  • 1970-01-01
相关资源
最近更新 更多