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

时间:2019-03-24 10:45:32

标签: firebase google-cloud-firestore firebase-security-rules

我正在为我的Firestore数据库定义规则,但我一直呆在那里。 我有一个帖子集合和一个userProfile集合。如果某位用户禁止了您,那么您将无法到达其职位。您可以在“文档/用户”下找到共享该帖子的用户

所以我尝试了此命令,但是没有用。当我模拟它时,每个人都会被拒绝。

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

因此,我想接受除被禁止的用户以外的所有人的阅读请求。

1 个答案:

答案 0 :(得分: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()

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

有关此的更多信息,请参见: