获取功能中的Firebase安全规则通配符

时间:2020-07-20 06:57:09

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

我正在努力解决一个乍看起来似乎很简单的问题,但是在尝试了数十种不同的语法后仍然无法解决问题。我有一个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命令,因为资源在子集合中不起作用。

0 个答案:

没有答案