首页 > 解决方案 > 如何通过规则为特定用户授予对多个 Firestore 文档的访问权限

问题描述

我想为特定用户组授予对特定文档的访问权限。如下图所示。我想为用户集合中的usergrp1授予对Doc1Doc3的访问权限。如何使用 Firestore 规则来做到这一点。

文件收集

在此处输入图像描述

带有组文档的用户集合

在此处输入图像描述

标签: firebasegoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


为了访问给定文档的安全规则中的其他 Firestore 文档,您应该使用get()exists()函数,如文档中所述。

但是,如果您将组的每个用户保存在“组”文档的特定字段中(如我们在屏幕截图中所见),您会遇到一些困难,因为您需要知道要检查哪个字段。

我建议这样做:对于属于组的每个用户,使用用户uid作为字段名称并分配一个虚拟值(true例如)。然后您可以轻松地检查文档中是否存在该字段,如下所示,例如,通过使用in运算符和get()函数:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /docs/{docId} {
      allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/users/usergrp1).data
    }
  }
}

但是,您可以在上面的规则中看到有一个问题:组名是硬编码的......

为了对docs集合中的每个特定文档都有一个组值(例如doc1,可以允许用户读取usergrp1),您需要在文档中保存可以访问它的组的名称。

如果将组名保存在名为的字段中,则可以通过第二次使用该函数authorizedGroup来调整规则如下:get()

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /docs/{docs} {
      allow read: if request.auth != null && request.auth.uid in get(/databases/$(database)/documents/users/$(get(/databases/$(database)/documents/docs/$(docs)).data.authorizedGroup)).data
    }
  }
}

推荐阅读