Google cloud firestore 在Google FireStore中保护并选择分层数据
我试图在Google Firestore中建立数据模型,这样当用户请求完成一个长操作时,我将创建一个文档,并随着操作的进行将结果添加到该文档的子集合中。这样,客户端(本例中为Android应用程序)将能够监听在长时间操作开始之前创建的文档上的更改,并且一旦该文档发生更改(假设我将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:
状态更新为“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;}`