我正在努力解决一个乍看起来似乎很简单的问题,但是在尝试了数十种不同的语法后仍然无法解决问题。我有一个Firebase数据库,其中包含一个名为users的集合,每个用户都有一个子集合“ posts”。我想通过实施安全规则来实现的是,只有该帐户为私人帐户,一个人的帖子才能自己阅读;如果该帐户是公共帐户,则所有人都可以阅读。因此,每个用户都有一个布尔字段isPublic。听起来很简单。这是我的代码:
match /users/{uid}{
function isPublic(){
return get(/databases/$(database)/documents/users/$(uid)).data.isPublic;
}
allow read, write: if request.auth.uid==uid
match /posts/{postid}{
allow read: if request.auth.uid==uid || isPublic();
}
该错误在第3行中。如果我对公共用户2的uid(当前,我只有2个用户)进行硬编码,并尝试以用户1的身份打开他的帖子,则效果很好。但是,每次使用通配符都会引发异常。
return get(/databases/$(database)/documents/users/$(uid)).data.isPublic; //does not work
return get(/databases/$(database)/documents/users/uid).data.isPublic; //does not work
let userid = uid;
return get(/databases/$(database)/documents/users/$(userid)).data.isPublic; //does not work
let userid = string(uid);
return get(/databases/$(database)/documents/users/$(userid)).data.isPublic; //does not work
return get(/databases/$(database)/documents/users/ogfTdmsSG4dy2AHf8dp7LcPpd9B3).data.isPublic; //works
我真的很感激有人可以告诉我正确的语法是什么。提前非常感谢您!
编辑
失败的关联查询是:
_database.userCollection.document(idOfUser2).collection('posts').getDocuments();
以激活安全性规则的用户2身份登录时,它可以正常工作;无论有哪个用户发出请求,它都可以不使用安全性规则,但在激活安全性规则的情况下,用户1发出请求时,失败。 >
另外,我应该提到,如果我使用另一个函数而不是get(例如,在第5行中这样:),它也可以正常工作。
allow read, write: if request.auth.uid==uid|| resource.data.isPublic
因此,我得出的结论是get命令不起作用。但是,我需要get命令,因为资源在子集合中不起作用。