如何从 Firestore 导出安全和索引规则?

Posted

技术标签:

【中文标题】如何从 Firestore 导出安全和索引规则?【英文标题】:How to export security and index rules from Firestore? 【发布时间】:2019-03-17 15:02:52 【问题描述】:

我在 Firestore 开发数据库上设置了多个不同的索引。现在,我想将它们导出到firestore.indexes.json,以便设置 prod 环境的过程更容易。有没有办法使用 Firebase CLI 导出这些索引?这同样适用于安全规则,尽管我知道我可以复制粘贴它们。

【问题讨论】:

【参考方案1】:

我认为目前没有用于从项目中获取 Firestore 安全规则的 API。您可以deploy rules through the CLI,它也可以嵌入到自定义节点脚本中,并从 CI 进程中调用。但据我所知,没有 API 可以从项目中读取规则。

file a feature request 听起来是个很好的理由。

【讨论】:

【参考方案2】:

有可能!

从您的 firebase 项目文件夹中的 CLI firebase firestore:indexes 运行。

如果您已经设置索引并通过 CLI 登录到 Firebase,您将获得一个格式化的 JSON 输出供您复制。

例子:


  "indexes": [
    
      "collectionId": "teslaData",
      "fields": [
        
          "fieldPath": "Model",
          "mode": "ASCENDING"
        ,
        
          "fieldPath": "Price",
          "mode": "ASCENDING"
        
      ]
    
  ]

可以使用firebase deploy --only firestore:indexes 重新导入导出的索引。检查以下文档摘录。

https://firebase.google.com/docs/firestore/query-data/indexing

您还可以使用 Firebase CLI 部署索引。要开始,请运行 firebase init firestore 在您的项目目录中。在设置过程中, Firebase CLI 会生成一个 JSON 文件,其中包含默认索引 正确的格式。编辑文件以添加更多索引并使用 firebase 部署命令。如果您只想部署索引,请添加 --only firestore:indexes 标志。如果您对索引进行编辑 使用 Firebase 控制台,确保您还更新了本地 索引文件。

我正在使用 Firebase CLI 4.2.1,如果有帮助,祝你好运 :)

编辑:截至9.6.0,它仍在工作。

【讨论】:

这是一个很棒的发现@fyllepo!我完全错过了您可以使用 firestore:indexes读取索引。我正在努力让它发挥作用,但似乎这只是在我身上。你让它工作了吗?如果是这样,我假设 JSON 文件只包含索引,而不包含安全规则。那是对的吗?您能否更新您的答案以显示 JSON 包含的内容? @FrankvanPuffelen 添加了一个例子,谢谢你的提示:) 这不再有效。结果以不同的格式返回:“indexes”:[“collectionGroup”:“posts”,“queryScope”:“COLLECTION”,“fields”:[“fieldPath”:“createdBy”,“order”:“ASCENDING " , "fieldPath": "createdAt", "order": "DESCENDING" ] , 这适用于我使用 firebase-tools (firebase-cli) 8.7.0。 像这样使用它:firebase firestore:indexes > firestore.indexes.json【参考方案3】:

任何集成开发环境都依赖于支持 Node.js(Firebase CLI 需要)的操作系统。因此,如果您查看 Nodes Filesystem 文档,就会发现如何以编程方式(通过 javascript)操作(复制/粘贴)文件的示例。至于以编程方式部署到 Firebase,请参阅 child_process.spawn

【讨论】:

【参考方案4】:

如果接受的答案不适合您(我遇到权限错误)对于 firestore 索引,您可以转到您的 firebase 控制台 > Cloud firestore > Indexes 然后在检查器中打开网络选项卡,清除所有请求并刷新这页纸。加载页面后,您可以在网络请求的 XHR 过滤器中找到索引的 JSON 格式响应(我通过在网络选项卡的搜索栏中搜索“索引”一词找到了我的)。它应该类似于 'indexes?key=...' 你可以复制这个 JSON 响应。

如果您已经在项目中使用 firebase init 初始化了 firebase,您只需将其粘贴到项目的 firestore.indexes.json 文件中即可。 然后将每个 name 属性更改为 collectionGroup 属性。例如:'name': 'projects/[your project name]...''collectionGroup': '[name of collection for this index]'

运行 firebase deploy --only firestore:indexes 将您在文本编辑器中所做的任何更改更新回 Firestore 索引选项卡

对于 firestore 安全规则,您可以以一种不太复杂但类似的方式,将 firebase 控制台中显示的规则复制并粘贴到项目的 firestore.rules 文件中。

示例firestore.indexes.json 文件


  "indexes": [
    
      "collectionGroup": "faq",
      "queryScope": "COLLECTION",
      "fields": [
        
          "fieldPath": "searchKeywords",
          "arrayConfig": "CONTAINS"
        ,
        
          "fieldPath": "answered",
          "order": "ASCENDING"
        ,
        
          "fieldPath": "relevanceScore",
          "order": "ASCENDING"
        ,
        
          "fieldPath": "__name__",
          "order": "ASCENDING"
        
      ]
    
  ]

【讨论】:

【参考方案5】:

在您的 Firebase 项目文件夹中,在终端中执行此操作:

firebase firestore:indexes > firestore.indexes.json

它会使用您的索引保存一个名为 firestore.indexes.json 的文件。

然后您可以将该文件上传到其他 Firebase 项目。

【讨论】:

以上是关于如何从 Firestore 导出安全和索引规则?的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 安全规则 - 如何检查某个字段是不是被修改?

如何根据设备平台为 Firestore 指定安全规则?

Ionic Firestore 安全问题和 Firestore 规则

有没有办法使用Firestore安全规则使用FieldValue.increment()更新文档字段?

我应该如何构建我的 Firestore 安全规则?

Firestore:删除文档和安全规则