【发布时间】:2020-12-18 06:06:30
【问题描述】:
我有一个关于 Firestore 规则的问题。
我有一个包含文档的集合...这些文档也有子集合....这些文档也有子集合。
例如
"Collection" -> "Document" -> "Sub-collection-1" -> "Document1" -> "Sub-collection-2" -> "Document2"
(i have changed the names to make it simpler to understand)
我在“文档”中存储了 2 个时间戳,用于控制用户何时能够阅读文档...例如它必须在“startTimestamp”之后但在“endTimestamp”之前。
我的规则如下。
allow read: if request.auth.uid != null
&& int(resource.data.startReadTimestamp) < request.time.toMillis()
&& int(resource.data.endReadTimestamp) > request.time.toMillis()
我的问题是,如果用户尝试阅读子集合文档,例如“Document1”或“Document2”以及他们请求的时间基于“Document”中的时间戳是无效的,这是否会因为父收集规则而自动拒绝?
如果没有,我已经看到您可以使用与 get 结合的功能来访问其他文档,但这似乎很浪费,因为这会收取我阅读的费用。
例如这样做
function getTopLevelDocData() {
return get(/databases/$(database)/documents/Collection/$(documentWildcard)).data
}
我能想到的唯一其他方法是将时间戳写入子集合中的每个文档...但这可能很难跟踪。
任何帮助表示赞赏:)
--- 更新
我刚刚尝试过,它确实允许读取“Document1”如果我不调用检查“Document1”规则中“Document”时间戳的函数...只是为了澄清将读取“Document1”或“Document2”只需额外读取 1 次,因为它必须检查“文档”时间戳?
--- 第二次更新
想象一下上例中的“Document”实际上的文档名称为“2020-08-29”。
如果我尝试读取“Document1”或“Document2”,是否存在不会导致任何文档读取但仍会阻止请求时间戳(转换后)与父“文档”名称不匹配的读取的 Firestore 规则,例如“2020-08-29”
例如,这样的东西可以吗?
match /collection/{document}{
match /Sub-collection-1/{document1}{
function transfomRequestTimestampToDate(){
return request.time.year() + "-" + request.time.month() + request.time.day();
}
allow read if request.auth.uid != null && transfomRequestTimestampToDate() == {document}
}
}
【问题讨论】:
标签: firebase google-cloud-firestore