【发布时间】:2018-09-20 04:28:14
【问题描述】:
我正在尝试从官方 Firestore docs 复制一个示例。您需要知道的一切都在屏幕截图中。是错误还是我遗漏了什么?
【问题讨论】:
标签: firebase google-cloud-firestore
我正在尝试从官方 Firestore docs 复制一个示例。您需要知道的一切都在屏幕截图中。是错误还是我遗漏了什么?
【问题讨论】:
标签: firebase google-cloud-firestore
问题是/cities/moscow没有实际文档
【讨论】:
多一点解释会使 manidos 的答案成为一个很好的答案。
似乎resources 应该只用于涉及已写入数据的规则;例如delete、read、update等
如果您想对“将要”写入的数据设置规则,请使用getAfter。
【讨论】:
request.resource访问你要写的数据
问题是 - 正如 manidos 所指出的那样,文件 /cities/moscow 不存在,因此无法访问该文件。但是,指定规则的一种更简洁的方法是:
allow read: if (resource == null) || (resource.data.visibility == 'public')
它允许应用程序查询不存在的数据而不会因安全异常而崩溃。
【讨论】:
关键是通读cmets。
许多应用程序将访问控制信息存储为文档中的字段 数据库。 Cloud Firestore 安全规则可以动态允许或 根据文档数据拒绝访问:
然后
// 如果文档的 'visibility' 字段设置为 'public',则允许用户读取数据
如果您查看指南中提供的示例数据
let citiesRef = db.collection("cities")
citiesRef.document("SF").setData([
"name": "San Francisco",
"state": "CA",
"country": "USA",
"capital": false,
"population": 860000,
"regions": ["west_coast", "norcal"]
])
没有“可见性”字段,但有名称、国家/地区字段等。
如果您想使用该数据集,请为每个城市添加一个“可见性”字段并将其值设置为“公共”
citiesRef.document("SF").setData([
"name": "San Francisco",
"visibility": "public"
【讨论】:
我还在学习,但有问题
允许读取:如果 (resource == null) || (resource.data.visibility == 'public')
当您对 /cities/{doc} 使用此类规则时。每当您搜索没有确切文档ID的文档时,我都可以看到resource == null;上述规则将显示 /cities/{doc} 的所有内容,私有和公共,因为资源始终 == null。
据我所知,只要在可以返回 1 个或多个文档的匹配中,就必须使用 get(...) 语句直接访问文档的数据,所以
get(/database/...).data.visibility == 'public'
【讨论】: