如何比较2条记录的权限(Firestore-Rule)

问题描述 投票:0回答:1

我正在为我的firestore数据库定义规则,我就在那里。我有一个帖子集合和一个userProfile集合。如果用户禁止您,则无法联系到他的帖子。您可以在“文档/用户”下找到共享帖子的用户

所以我尝试这个命令但没有奏效。当我模拟它时,每个人都会拒绝。

match /posts/{currentDocument} {
  allow read: if !exists(
    /databases/$(database)/documents/userProfile/$(request.auth.uid)/banned/
    $(/databases/$(database)/documents/posts/$(currentDocument)/user)
  )
}

所以除了被禁止的用户之外,我想接受每个人的阅读请求。

firebase google-cloud-firestore firebase-security-rules
1个回答
0
投票

这取决于你如何尝试从集合中读取。

如果您正在尝试阅读非禁止用户的特定文档(例如/posts/post123),那么阅读应该有效。如果您尝试从禁止的用户读取特定文档,则应拒绝阅读。

如果您正在尝试阅读整个/posts集合,那么上述安全规则确实会失败。原因是安全规则不会过滤您的数据;它们仅确保读取操作仅尝试读取其授权的数据。并且读取所有/posts都是未经授权的,因为某些文档不可读。

要阅读来自非禁止用户的所有帖子,您需要附加仅尝试阅读这些文档的侦听器。在伪代码中,类似于:

db.collection('posts').where('user', 'not in', '/bannedusers')

但遗憾的是,这在Firestore中是不可能的,因为它需要服务器端连接,这将使Firestore无法满足其性能保证。

但是比如说你有一个批准流程,每个帖子需要得到批准才能被其他用户阅读。在这种情况下,您可以在安全规则中强制执行以下操作:

// anyone can read approved posts, but only the author can read unapproved posts
allow read: if resource.data.approved == true || request.auth.uid == resource.data.author

然后只查询已批准的帖子:

db.collection("posts").where("approved", "==", true).get()

在最后一个示例中,安全规则可以验证查询仅请求他们有权访问的帖子,因此它允许查询。

有关详细信息,请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.