如果不存在安全规则,Firestore 将创建文档

2023-12-06

我试图编写一个规则,如果文档的 id 不存在,则创建一个新文档。我的目标是:

Message message = new Message(userId, title, messageBody, timestamp);

我正在使用WriteBatch创建一个新文档并更新该文档:

mWriteBatch.set(mMessageRef.document(messageId), message);

mWriteBatch.update(mMessageRef.document(mIntentMessageId), // params...);

浏览完文档和这个网站后,我发现如果我使用create方法,仅如果数据不存在则允许写入.

所以我创建了一个安全规则,例如:

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();
}

这次它也覆盖了数据而不是显示错误。

我在这里做错了什么?任何帮助表示赞赏。

Update:正如何塞·大卫·阿罗斯蒂 (José David Aroesti) 在《comments,我必须将其更改为exists并删除update and delete才能正常工作,并且从应用程序中它反映了它应该做的事情。但那我该怎么办update and 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;

是否可以?


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

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

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

正如@creativecreatorormaybenot建议的那样,你不应该指定allow的表达式update and delete所以数据不能被覆盖。

这是文档的链接:

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果不存在安全规则,Firestore 将创建文档 的相关文章

随机推荐

  • FOUND_ROWS() 不断返回 0

    result db con gt query SELECT SQL CALC FOUND ROWS FROM users LIMIT 0 10 count result db con gt query SELECT FOUND ROWS a
  • 为什么-use-network=false

    有人知道为什么我必须在 Flex Builder 中使用 use network false 吗 这是在项目属性中设置的 并且是附加编译器参数 仅当我想读取 XML 等外部文件时才会出现这种情况 我团队中的其他人不必有 use networ
  • 在 R 中读取格式错误的 csv - 引号不匹配

    我有数百个大型 CSV 文件 每个文件的大小从 10k 行到 100k 行不等 其中一些文件的描述格式不正确 引号内有引号 因此它们可能看起来像 ID Description x 3434 abc def 988 2344 fred 348
  • 当我将两个脚本添加到 html 页面时..其中一个不起作用 [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我创建了两个 jquery 和 script 标签来日历确认 但是当它们位于单独的 ht
  • 在 WinForms 中将窗口保持在顶部并窃取焦点

    我意识到在正常情况下这将是完全不好的做法 但这仅适用于需要从条形码扫描仪 模拟键盘 获取输入的测试应用程序 问题是我需要在扫描时启动一些脚本 所以我需要在单击脚本运行它后窗口直接重新获得焦点 我尝试过使用Activate BringToFr
  • Arquillian 嵌入式 Glassfish 证书已过期

    8 月 14 日 Glassfish 使用的 gtecybertrust5ca 证书过期 导致我的 Arquillian 测试打印错误 这个问题与这个问题类似 启动 Glassfish 3 1 2 时日志中的证书已过期 除了 我正在使用Em
  • Pandas 数据精度[重复]

    这个问题在这里已经有答案了 默认情况下 数据框中的数值最多仅存储 6 位小数 我如何获得完整的精度 例如34 98774564765 存储为 34 987746 我确实想要完整的价值 0 00000565 存储为 0 除了将格式应用于每个数
  • 循环多个表执行同一个查询

    我有一个数据库 每天都会创建一个表来记录流程实例 这些表标记为 MESSAGE LOG YYYYMMDD 目前我想对所有这些表顺序执行相同的查询 我编写了下面的 PL SQL 但卡在第 10 行 如何针对此处的所有表成功执行 SQL 语句
  • 如何指定无分区密钥来删除文档DB Java SDK中的文档?

    我只有一个集合 当我尝试使用以下代码删除文档时 PartitionKey partitionKey new PartitionKey undefined RequestOptions requestOptions new RequestOp
  • 如何在 vb.net 中使用 OLE DB 更改 Crystal Reports 连接字符串?

    我有一个 Connection vb 其中存储了我的所有连接字符串并由整个程序使用 我是 Crystal Reports 的新手 并且我想根据我创建的连接字符串更改其连接字符串 我使用 MS SQL 2008 SQL Server Nati
  • 为什么局部类接受静态最终变量?

    我用谷歌搜索了这个广泛但无济于事 我似乎无法理解这个概念 为什么本地类接受静态最终字段 比如下面的例子 public void sayGoodbyeInEnglish class EnglishGoodbye public static f
  • 在 Visual Studio Code 和 Delve 调试器中使用标签调试 Go

    Answer 根据putus的回答 我想出了以下配置来一键构建和调试 首先 您需要添加一个任务来构建具有相应标签的二进制文件 See https go microsoft com fwlink LinkId 733558 for the d
  • Razor View Engine:表达式树可能不包含动态操作

    我有一个与此类似的模型 public class SampleModel public Product Product get set 在我的控制器中 我尝试打印时遇到异常 Html TextBoxFor p gt p Product Na
  • 使用hash时如何将id作为选择器?

    假设有以下 html div test1 div div test2 div 现在 以下内容不起作用 为什么 css test 1 color red jQuery test 2 css color blue 要使用任何元字符 例如 和 作
  • Urban Airship - 使用 NSURLConnection 发送推送

    我正在开发一个简单的原型 需要测试从一台设备向另一台设备发送推送通知 我已向 Urban Airship 发送电子邮件 要求为我的应用程序打开 允许从设备推送 他们确实打开了它 我正在尝试使用 NSURLConnection 从设备发送推送
  • Java ActionListener 错误:类型不兼容

    我在 JButton 上设置 ActionListener 时遇到一些问题 这是代码 package pipes import java awt import java awt event import javax swing public
  • 关闭窗口 - 如何确定窗口是如何打开的?

    在一页上 我有一个超链接target blank 在目标页面上 我有一个 关闭 按钮 它使用 JS 关闭新选项卡 窗口 如果用户点击超链接 我可以使用JS关闭打开的窗口 伟大的 如果用户右键单击链接并选择 在新选项卡中打开 我的 JS 事件
  • 从 GtkBin 扩展

    我正在尝试制作一个自定义小部件 类似于 Gtk 在所有类似 TreeView 的小部件上使用的 快速搜索 条目 这是我最初想法的一个简化示例 from gi repository import Gtk class QuickSearch G
  • 何时在 Modelica 语言中使用 noEvent 运算符?

    Modelica 中的 noEvent 运算符不使用迭代来查找触发事件的精确时刻 看来这会导致计算错误 这是我在以下网站上找到的示例https mbe modelica university behavior discrete decay
  • 如果不存在安全规则,Firestore 将创建文档

    我试图编写一个规则 如果文档的 id 不存在 则创建一个新文档 我的目标是 Message message new Message userId title messageBody timestamp 我正在使用WriteBatch创建一个