我需要将对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");
});