firebase - 如果提供了特定字段,则 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
依然没有。尝试使用hasAll和hasOnly,仍然没有。我认为发生的是request.resource.data在简单列出文档时实际上并不存在。
我知道您可以检查query.orderBy,但这对我来说没有帮助。
请指教
解决方案
request.resource.data.keys().hasAny(['postId'])
当前不支持您正在执行的操作。请注意,API 文档中提到了request.resource:
新资源值,仅在写入请求时出现。
安全规则不提供对查询过滤器中数据的访问。也就是说,不存在需要特定命名过滤器才能执行查询的表达式。(当然,您可以通过将现有文档字段值与已知字符串或变量进行比较来检查过滤器的值是否有效。)
正如您在评论中建议的那样,您应该使用 postId 作为集合的文档 ID 来组织数据。这将强制客户端知道文档的 postId,只要您禁止list
访问该集合(这将拒绝所有不仅仅是文档获取的查询)。
推荐阅读
- amazon-web-services - AWS Cognito Lambda 授权方 - 401 未经授权的错误
- c++ - Qt5Quickd.lib(Qt5Quickd.dll):致命错误 LNK1112:模块机器类型“x64”与目标机器类型“x86”冲突
- php - 如何使用工作代码在 php 中使用 Ajax 调用创建磁卡读卡器代码?
- django - non_field_errors,无效数据。DRF
- excel - 删除第一个单元格时自动向上移动列中的单元格
- dart - 如何找到 Pub 包的大小?
- powershell - 如何根据PowerShell中的模式提取文件夹内的文件名
- node.js - 在 Windows 10 和 Windows Server 2012 及更高版本上托管“node.js”应用程序的现代方式是什么?
- laravel - 使用外部表的属性过滤 eloquent 集合
- javascript - 如何使用 Cordova 向 iOS 上的 Facebook 好友发送邀请?