Firebase安全规则:允许对除单个集合外的所有内容进行读写

时间:2019-09-02 18:47:45

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

我需要将对Firestore中的单个集合(键)的读取访问权限限制为仅具有某些uid的经过身份验证的用户。所有其他经过身份验证的用户都可以查看数据库中的任何其他集合/文档。

这是第一次尝试吗

service cloud.firestore {
  match /databases/{database}/documents {
    match /{col}/{doc}/keys/{key} {
      allow read: if request.auth.uid == "A" ||
      request.auth.uid == "B" ||
      request.auth.uid == "C";
    }

    match /{document=**} {
      allow read, write: if request.auth.uid != null && !("key" in resource.data);
    }
  }
}

不幸的是,当用户尝试在/ {col} / {doc}中创建新集合时(即与“键”同级的集合),用户会收到此错误消息

  

io.grpc.StatusException:PERMISSION_DENIED:缺少权限或权限不足。

如果这是Java,我将在路径上运行indexOf,拒绝它是否包含“ keys”,否则允许。但是,根据《 Firebase规则参考》,Path对象不支持indexOf。

这是导致错误的代码。在这种情况下,“框”和“ CFI”集合在FireStore中尚不存在,因此它们通常在代码运行时创建。

final DocumentReference firstDocRef = firestore.document("test/laksdfjasdf/programCounters/hjg65ffgjj");   
CF cfNew = Utils.getCF();
firestore.runTransaction(transaction -> {            
    DocumentSnapshot snapshot = transaction.get(firstDocRef);
    HashMap<String, Object> updatedMap = new HashMap<>();
    updatedMap.put("num", cfNew.getNum());
    transaction.update(firstDocRef, updatedMap);

    Box newBox = createNewBox(cfNew);
    final DocumentReference newBoxRef = firestore.collection(
            "test/laksdfjasdf/boxes")
            .document("" + newBox.getBoxNumber());
    transaction.set(newBoxRef, newBox);

    final DocumentReference newCFIRef = firestore.collection("test/laksdfjasdf/CFI")
            .document("" + cfNew.getCreated().hashCode());

    transaction.set(newCFIRef, cfNew);
    return newBox;
}).addOnSuccessListener(box -> {
    Log.d(TAG, "SUCCESS");
}).addOnFailureListener(e -> {
    Log.d(TAG, "Failure");
});

0 个答案:

没有答案