如何从 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 安全规则 - 如何检查某个字段是不是被修改?
Ionic Firestore 安全问题和 Firestore 规则