【问题标题】:How to give access to Multiple Firestore Documents for Specific Users through Rules如何通过规则为特定用户授予对多个 Firestore 文档的访问权限
【发布时间】:2021-01-08 06:56:18
【问题描述】:

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

文档集合

带有组文档的用户集合

【问题讨论】:

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


    【解决方案1】:

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

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

    我建议执行以下操作:对于属于组的每个用户,使用用户 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
        }
      }
    }
    

    【讨论】:

    • 谢谢先生,我认为它几乎完美,它的返回数据也一样,但我似乎阅读刺激失败
    • 嗨 Renaud,我在 firebase.google.com/docs/firestore/solutions/role-based-access 的 firebase 文档上关注了一个类似的例子,但是在设置之后,尝试从客户端(js)查询数据库失败,因为它说 @987654340 @。我被告知客户端查询需要匹配规则,但是如何根据上面的示例或文档中的示例进行查询?
    猜你喜欢
    • 1970-01-01
    • 2017-01-25
    • 2020-11-10
    • 2021-08-10
    • 2011-08-30
    • 1970-01-01
    • 2014-02-18
    • 2012-04-15
    • 1970-01-01
    相关资源
    最近更新 更多