我正在为firebase编写云firestore的规则,我想限制使用用户访问数据库' auth id,但规则不符合我的预期。
所以,我的数据库结构是这样的:
/用户/ {用户id} /组/ {的groupId}
我希望只有用户才能使用自己的userId访问文档。
为实现这一目标,我编写了如下规则:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId=**} {
allow read: if userId == request.auth.uid;
}
}
}
但有了这个,我的用户无法阅读他们自己的"组"来自数据库。
我正在使用javascript和代码来检索" groups"如下:
console.log("uid: ", uid)
db.collection("users/" + uid + "/groups")
.onSnapshot(function(querySnapshot) {
querySnapshot.forEach(function(doc) {
console.log(doc.data())
})
})
既然cloud firestore没有像实时数据库这样的调试工具,我自己做了一些调试。
我有一个测试用户的uid为" 5lS2NA21UgbabEw4AkyWyef9FH42",所以我改变了这样的规则:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId=**} {
allow read: if "5lS2NA21UgbabEw4AkyWyef9FH42" == request.auth.uid;
}
}
}
有了这个,我的测试用户就能够成功检索"组"来自他的文件的数据(当然所有其他用户都可以,但是)。
现在我将规则改为:
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId=**} {
allow read: if "5lS2NA21UgbabEw4AkyWyef9FH42" == userId;
}
}
}
现在我无法从数据库中获取任何数据。
有人能告诉我我做错了吗?
答案 0 :(得分:0)
我想我已经弄明白了。问题是这个{userId = **}
如果您有以下规则
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId=**} {
allow read: if userId == request.auth.uid;
}
}
}
并且正在尝试访问用户/ 5lS2NA21UgbabEw4AkyWyef9FH42 / groups," userId"变量不评估为5lS2NA21UgbabEw4AkyWyef9FH42(我不知道它会是什么,但我会猜测" 5lS2NA21UgbabEw4AkyWyef9FH42 / groups")。因此,如果要对文档进行私有化,则必须在规则中指定每个文档,如下所示。
service cloud.firestore {
match /databases/{database}/documents {
match /users/{userId} {
match /groups/{groupId} {
allow read: if userId == request.auth.uid;
}
match /events/{eventId} {
allow read: if userId == request.auth.uid;
}
}
}
}