首页 > 解决方案 > 如果提供了特定字段,则 Firestore 允许列表

问题描述

所以我一直在寻找很多东西,但我找不到任何关于这件事的东西。收集只有登录用户才能阅读的帖子评论。

如何为列表操作编写安全规则,以便仅在尝试获取特定帖子的评论时允许列表。查询很简单,如下:

let query = store.comments
    .where( 'postId', '==', postId )
    .orderBy( 'createdAt', 'desc' )
    .limit(10)
    .get()

我担心人们只是在没有特定 postId的情况下获取评论。所以我将查询文档的数量限制为最大值。每个请求 10 个并且在这样做时需要登录,但是,为了尝试仅在postId存在时允许列出,我尝试了很多变体,但没有一个有效。

match /comments/{key} {
  allow list: if isLoggedIn() && request.query.limit <= 10 && request.resource.data.keys().hasAny(['postId'])
}

不工作。

allow list: if isLoggedIn() && request.query.limit <= 10 && request.resource.data.postId is string

也不工作。

allow list: if isLoggedIn() && request.query.limit <= 10 && request.resource.data.postId == resouce.data.postId

依然没有。尝试使用hasAllhasOnly,仍然没有。我认为发生的是request.resource.data在简单列出文档时实际上并不存在。

我知道您可以检查query.orderBy,但这对我来说没有帮助。

请指教

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


request.resource.data.keys().hasAny(['postId'])当前不支持您正在执行的操作。请注意,API 文档中提到了request.resource

新资源值,仅在写入请求时出现。

安全规则不提供对查询过滤器中数据的访问。也就是说,不存在需要特定命名过滤器才能执行查询的表达式。(当然,您可以通过将现有文档字段值与已知字符串或变量进行比较来检查过滤器的是否有效。)

正如您在评论中建议的那样,您应该使用 postId 作为集合的文档 ID 来组织数据。这将强制客户端知道文档的 postId,只要您禁止list访问该集合(这将拒绝所有不仅仅是文档获取的查询)。


推荐阅读