【发布时间】:2018-08-29 12:05:09
【问题描述】:
我的 firestore 数据库的结构是“联赛”是顶级集合,每个联赛都包含一个以每个批准的用户 ID 命名的字段(带有一个数字值)。
每个联盟还有一个以每个批准的用户 ID 命名的文档子集合“用户”。
这是一个示例 firestore 查询:
FirebaseAuth mAuth = FirebaseAuth.getInstance();
// userId = ABCDEF123 for this example
String userId = mAuth.getCurrentUser().getUid();
FirebaseFirestore firestore = FirebaseFirestore.getInstance();
firestore.collection("leagues").whereLessThan(userId, 99).get();
谁能告诉我为什么这条规则有效:
match /leagues/{league} {
allow read, write: if resource.data.ABCDEF123 != null;
但不是这个:
match /leagues/{league} {
allow read, write: if resource.data.request.auth.uid != null;
另外,为什么这条规则有效:
//"ZYXWV987" is an example of a league the user is in
match /leagues/{league} {
allow read, write: if exists(/databases/$(database)/documents/leagues/$('ZYXWV987')/users/$(request.auth.uid));
但不是这个:
match /leagues/{league} {
allow read, write: if exists(/databases/$(database)/documents/leagues/$(league)/users/$(request.auth.uid));
我得到的错误是“com.google.firebase.firestore.FirebaseFirestoreException: PERMISSION_DENIED: Missing or enough permissions”
我希望了解这些规则的工作原理,以及如何为我的数据库实施适当的规则!
编辑:
我现在意识到这是可行的(仍然是 WIP):
match /leagues/{league} {
allow read, create, update: if request.auth.uid != null;
//only ever deleting a single league at a time
allow delete: if exists(/databases/$(database)/documents/leagues/$(league)/users/$(request.auth.uid));
match /{docs = **} {
allow read, write: if exists(/databases/$(database)/documents/leagues/$(league)/users/$(request.auth.uid))}
}
而且我有点理解发生了什么(在一个请求中读取/写入可能超过一个联赛时,我不能使用 {league} 通配符?),但我仍然不确定为什么?
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security