具有基于用户访问权限的Firebase安全规则-权限被拒绝错误

时间:2020-05-24 13:21:29

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

我的应用尝试读取“站点”集合下的文档。我做了一个模拟读取操作,如下所示工作正常:

Profile/'actual profile id'/Sites/'actual site id'

此模拟读取有效,可能是因为我正在读取预定义的文档。我不确定。

我的安全规则如下:

match /Profile/{profile}/Sites/{site} {
 allow read: if isOneOfRoles (get(/databases/$(database)/documents/Profile/$(profile)/Sites/$(site)),['FULL', 'OWNER', 'VIEW']);
}

function getRole(rsc) {return rsc.data.SHARED_WITH[request.auth.token.email];}

function isOneOfRoles(rsc, array) {return isSignedIn() && (getRole(rsc) in array);}

最后我的查询如下:

Firestore.instance.collection('Profile/${_firebaseUser.uid}/Sites')
        .where('ARCHIVE',isEqualTo: false)
        .orderBy('DATE',descending: true)
        .getDocuments();

我的数据库结构如下所示: enter image description here 我的控制台出现权限被拒绝错误。在了解我要去哪里哪里需要帮助吗?

1 个答案:

答案 0 :(得分:1)

该规则拒绝您的查询,因为Firebase security rules are not filters。您不能使用规则来限制与查询匹配的文档集。

现在,您的查询要求了解所有文档,其中ARCHIVE = true,但是您的规则不允许查询依赖于基于查询数据的其他一些文档的文档。规则引擎将不会读取并检查所有其他文档中的每个文档-这根本无法扩展。

您将不得不找到另一种结构化数据的方式,可能是将权限放入每个文档本身,并将这些权限用作查询过滤器的一部分。