Google cloud firestore 在Google FireStore中保护并选择分层数据

Google cloud firestore 在Google FireStore中保护并选择分层数据,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我试图在Google Firestore中建立数据模型,这样当用户请求完成一个长操作时,我将创建一个文档,并随着操作的进行将结果添加到该文档的子集合中。这样,客户端(本例中为Android应用程序)将能够监听在长时间操作开始之前创建的文档上的更改,并且一旦该文档发生更改(假设我将状态更新为“done”),我将查询该文档的子集合以获得结果 假设根文档是/frame refresh requests/{req id},文档如下所示 { uid: "123", status:

我试图在Google Firestore中建立数据模型,这样当用户请求完成一个长操作时,我将创建一个文档,并随着操作的进行将结果添加到该文档的子集合中。这样,客户端(本例中为Android应用程序)将能够监听在长时间操作开始之前创建的文档上的更改,并且一旦该文档发生更改(假设我将
状态更新为
“done”
),我将查询该文档的子集合以获得结果

假设根文档是
/frame refresh requests/{req id}
,文档如下所示

{
 uid: "123",
 status: "in-progress"
}
我的问题是如何确保子集合文档的安全,使我能够监听子集合文档上的
onSnapshot

我目前的解决方案是将
uid
fiedld复制到子集合中的每个文档,这是个好主意吗

我当前的安全规则如下所示:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /frame-refresh-requests/{refresh_doc_id} {
    
      function isAllowedToReadRefresh() {
        return resource.data.device_id == request.auth.uid;
      }
      
      allow read: if isAllowedToReadRefresh();
      
      match /streams/{doc_id} {
        allow read: if isAllowedToReadRefresh();
      }
    }

    match /{document=**} {
      allow read, write: if false;
    }
}
这样,我必须向所有文档添加
device\u id
字段,以便能够根据用户id对其进行过滤,以便能够选择多个文档


我不担心数据的非规范化,我只是想了解是否有更好的方法。

如果您想复制子集合中每个文档中的设备id字段,这不一定是“坏的”。nosql类型数据库中的数据重复非常常见。但是,在这种情况下不需要它。安全规则可以作为其评估的一部分。您可以简单地创建父文档,并根据需要在任何子集合的规则中使用其数据

      match /streams/{doc_id} {
        allow read: if get(/databases/$(database)/documents/frame-refresh-requests/$(refresh_doc_id)).data.device_id == request.auth.uid;
      }

请编辑问题,并提供有关当前安全规则的详细信息,以及子集合的特定安全要求。你现在说的有点太模糊了,无法理解你想要实现什么。如果不知道应该允许或拒绝哪些客户端查询,安全规则就没有意义。谢谢。几件事:1。如果我这样做,我需要将规则更改为
/frame refresh requests/{refresh\u doc\u id}/{document=**}
以捕获所有子集合文档,对吗?2.由于某种原因,当我使用以下规则时,我总是会得到
缺少或权限不足的
错误match/frame-refresh-requests/{refresh\u-doc\u-id}/{document=**}{allow-read:if-request.auth.token.isDevice==true&&get(/databases/{database}/documents/frame-refresh-requests/{refresh\u-doc\u-id})。data.device\u-id==request.auth.uid;}`