Firebase Firestore用于在另一个集合中的文档中查找数据的匹配规则

Firebase Firestore用于在另一个集合中的文档中查找数据的匹配规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,当权限存储在另一个集合的另一个文档中时,我对Firestore规则有问题。我还没有找到任何这样的例子,但我读到这是可以做到的 我想这样做是为了避免当一个学生和许多其他学生分享他的家庭作业清单时不得不写很多东西。是的,我知道这算是另一次阅读 我有3个集合、用户、权限和作业以及一些示例数据 用户 { id: fK3ddutEpD2qQqRMXNW, name: "Steven Smith" }, { id: YI2Fx656kkkk25, name: "Beck

当权限存储在另一个集合的另一个文档中时,我对Firestore规则有问题。我还没有找到任何这样的例子,但我读到这是可以做到的

我想这样做是为了避免当一个学生和许多其他学生分享他的家庭作业清单时不得不写很多东西。是的,我知道这算是另一次阅读

我有3个集合、用户、权限和作业以及一些示例数据

用户

{
    id:  fK3ddutEpD2qQqRMXNW,
    name: "Steven Smith"
},

{
    id:  YI2Fx656kkkk25,
    name: "Becky Kinsley"
},

{
    id:  CAFDSDFR244bb,
    name: "Tonya Benz"
}
权限

{
    id:  fK3ddutEpD2qQqRMXNW,
    followers: [YI2Fx656kkkk25,CAFDSDFR244bb]  
}
{
    id:  adfsajkfsk4444,
    owner:  fK3ddutEpD2qQqRMXNW,
    name: "Math Homework",
    isDone: false
}
家庭作业

{
    id:  fK3ddutEpD2qQqRMXNW,
    followers: [YI2Fx656kkkk25,CAFDSDFR244bb]  
}
{
    id:  adfsajkfsk4444,
    owner:  fK3ddutEpD2qQqRMXNW,
    name: "Math Homework",
    isDone: false
}
我的firestore规则的开始:

 service cloud.firestore {

//lock down the entire firestore then open rules up.
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if false;
    }

match /homework/{      } {
      allow get: if isSignedIn()

    }

// helper functions
    function isSignedIn() {
      return request.auth != null;
    }

    function isUser(userId) {
      return request.auth.uid == userId;
    }

    function isOwner(userId) {
        return request.auth.uid == resource.data.uid;
    }

  }
}
用例:

 service cloud.firestore {

//lock down the entire firestore then open rules up.
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if false;
    }

match /homework/{      } {
      allow get: if isSignedIn()

    }

// helper functions
    function isSignedIn() {
      return request.auth != null;
    }

    function isUser(userId) {
      return request.auth.uid == userId;
    }

    function isOwner(userId) {
        return request.auth.uid == resource.data.uid;
    }

  }
}
史蒂文·史密斯与托尼·本茨分享了他的家庭作业清单

Tonya Benz登录应用程序查看她的朋友Steven的家庭作业。应用程序运行此查询以获取Steven Smith的家庭作业列表

var homeworkRef = db.collection("homework");
var query = homeworkRef.where("owner", "==", "fK3ddutEpD2qQqRMXNW");
问题:

当用户Tonya Benz登录以运行此查询时,采用家庭作业集合中的“所有者”字段作为权限集合中的id进行查找的正确Firestore匹配规则是什么

使用当前的查询和数据库结构,您将无法使用安全规则实现目标

首先,听起来您希望能够根据另一个文档的内容过滤查询结果。安全规则不能充当查询筛选器所有必须根据安全规则授予查询匹配的文档读取权限,否则整个查询将被拒绝。您需要提出一个查询,具体说明应该允许访问哪些文档。不幸的是,没有一个查询可以在当前结构中实现这一点,因为这需要权限和作业之间的某种“连接”。但是Firestore(和所有NoSQL数据库一样)不支持连接

您需要以与规则兼容的方式对数据进行建模。你有一个我能想到的选择

您可以在同一文档中存储应该已经阅读并有权访问作业中特定文档的列表用户,以列表字段表示。查询可以根据用户在该列表字段中的uid状态指定筛选器。而且该规则可以指定只读访问权限只能授予ID在该列表中的用户

{
    id:  adfsajkfsk4444,
    owner:  fK3ddutEpD2qQqRMXNW,
    name: "Math Homework",
    isDone: false,
    readers: [ 'list', 'of', 'userids' ]  // filter against this list field
}
这里的底线是,您需要满足以下两个要求:

  • 您的查询需要具体说明它希望哪些文档是可读的。不能使用规则筛选结果
  • 您的规则需要一种方法来确定当前uid的访问权限,只需使用文档本身的字段,或者在其他已知文档上使用
    get()

  • 出于同样的原因,我认为这不会有帮助。您仍然需要一种方法来在查询中只筛选预期可读的文档。本页最后讨论了大团体。“大型组:如果您需要与非常大或复杂的组共享,考虑一个系统,其中角色存储在自己的集合中,而不是作为目标文档上的字段。”是否有一个代码示例,其中的规则在何处被使用?2。在这段谷歌Firebase视频中,他谈到了2个选项,选项1。视频播放8点25分。他谈到使用子集合或访问控制列表选项2。在9:13的视频中,他展示了一个私人数据列表。但是,我在任何地方都找不到任何代码和规则示例。你能给我指一下这方面的代码示例吗?堆栈溢出不是一个很好的例子。要求外部参考的问题通常以主题外的形式结束。如果你有一个一般性的问题,试着发到或。我不是要求外部参考。我要求的是与上述问题有关的东西。我引用了谷歌自己的文档和视频,其中谈到了能够做到这一点。