我想做的是创建一个Firebase规则,如果allow create
中不存在ID,该规则将允许创建操作。具体来说,我使用的是Firestore,而不是Firebase实时数据库。我真的是Firebase的新手,但是在发布之前进行了一些研究。我看到的大多数示例都围绕auth。
请考虑以下数据结构。集合的名称称为flags
US - //(This is the document ID. Not auto generated
- country: United Stages
- name: US
- colors: [red, white, blue]
UK -
- country: United Kingdom
- name: UK
- colors: [red, white, blue]
我要写的规则是,如果发布的数据中的name
与现有的文档ID不匹配。我之所以选择设置自己的文档ID,是因为article
我当前的规则是:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
allow read: if isLoggedIn();
allow create: if ! exists(/databases/$(database)/documents/flags/$(inComing().name))
// functions
function isLoggedIn() {
return request.auth != null
}
function inComing() {
return request.resource.data
}
}
}
但是当我尝试发布一些不存在的文档ID的数据时,出现了拒绝访问错误。我已登录到应用程序,因此我知道它在规则的第一部分没有失败。
总而言之,我的问题是:
name
键检查文档ID是否存在?所以我要尝试的是allow create: if ! exists(/databases/$(database)/documents/flags/$(inComing().name))
。在模拟器中,我正在使用create
,并将路径设置为flags/US
。有效载荷为:
{"__name__":"/databases/(default)/documents/flags/US","id":"US","data":{"name":"US"}}
如果运行模拟器,则会拒绝访问,这是预期的。但是,如果我将路径更改为flags/CA
或将有效负载更改为{"name":"CA"}
(不存在),则访问将被拒绝。