Firebase Firestore安全规则如何链接逻辑运算符和/或?

Firebase Firestore安全规则如何链接逻辑运算符和/或?,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,这是我应用程序的聊天部分。聊天消息位于一个集合中,通过将usersid与friendsID散列而命名。每个消息文档都以其时间戳为标题 此安全规则拒绝每次访问集合的尝试: match /messages/{messageThreadId}/{messageCollectionId}/{timeStamp} { allow read, write, update, delete: if request.auth != null && (resource.data

这是我应用程序的聊天部分。聊天消息位于一个集合中,通过将usersid与friendsID散列而命名。每个消息文档都以其时间戳为标题

此安全规则拒绝每次访问集合的尝试:

    match /messages/{messageThreadId}/{messageCollectionId}/{timeStamp} {
      allow read, write, update, delete: if request.auth != null 
&& (resource.data.idFrom == request.auth.uid || resource.data.idTo == request.auth.uid);
      allow create: if request.auth != null;
    }
我尝试了很多方法,去掉了OR运算符周围的括号,在规则中将ID硬编码为字符串,这是一个很好的例子。我已经尝试拨回规则,允许任何人登录,这确实有效,但无法保护用户的消息。所以这条规则实际上有点不对劲

规则在做什么,或者有什么问题?如何使用消息文档的
ifFrom
IdTo
字符串字段进行筛选?是否允许在规则中使用多个逻辑运算符?逻辑周围的括号是否如您预期的那样工作

以下是失败的Firestore查询:

StreamBuilder(
              stream: FirebaseFirestore.instance
                  .collection('messages')
                  .doc(groupChatId)
                  .collection(groupChatId)
                  .orderBy('timestamp', descending: true)
                  .limit(20)
                  .snapshots(),
我需要它,这样只有那些发送或接收信息的人才能阅读它,我需要安全规则来防止窃听

这是一个消息文档:
多亏了@LeadDreamer,我有了一个解决方案

LeadDreamer说,要使查询通过Firestore规则,查询的所有结果也必须通过Firestore规则。因此,如果你有一个蓝色大象和一个富人的集合,并且你用“只接受蓝色大象的查询”规则来确保它的安全,然后查询Firestore的“请一切”,那就太难了!对于一头蓝色的大象来说,穿过针眼要比富人绕过消防商店的安全规则容易得多。谚语

因此,我需要重新配置消息文档,以便可以根据用户的
请求检查ID。auth.uid
我将它们放在消息文档中的FirebaseID数组中。我从我的颤振应用程序中查询了我的邮件收集,因此:

  : StreamBuilder(
      stream: FirebaseFirestore.instance
          .collection('messages')
          .doc(groupChatId)
          .collection(groupChatId)
          .where("firebaseIds", arrayContains: prefs.getString('firebaseId'))
          .orderBy('timestamp', descending: true)
          .limit(20)
          .snapshots(),
然后,规则查询每个消息记录数组中的用户
auth.uid

   match /messages/{messageThreadId}/{messageCollectionId}/{timeStamp} {
      allow read, write, update, delete: if request.auth != null 
        && request.auth.uid in resource.data.firebaseIds;
      allow create: if request.auth != null;
   }
该漏洞是一个恶意用户,可以攻击与他们通信的人的聊天信息,删除或更新他们的信息或向他们发送信息。他们只能在他们的消息线程中这样做,所以我不认为这是一种威胁


Firebase需要自动为我创建一个复合索引,以使这一切正常工作。

如果不使用查询请求文档,安全规则就没有任何意义。请显示您正在使用的精确查询,以及它是如何失败的。最重要的是要记住:安全规则不是过滤器。您的查询是过滤器;查询中请求的所有文档必须通过安全规则,否则整个查询将被拒绝。感谢您的关注,提供了更多信息。我需要规则来阻止窃听者,这样只有这两个参与聊天的人才能访问他们的消息。您的查询必须包括idfrom和idto-安全规则不仅会通过匹配的DoxUnits传递-这不是安全规则的工作方式。安全规则不检查您的实际记录-它们检查您的查询是否可以访问与规则不匹配的记录,并阻止这些查询。还要注意,没有“或”查询,因此在您的情况下,您需要两个查询,一个用于idfrom,一个用于idto。