Firestore规则:如果给定文档不存在但在获取中使用了该怎么办?

时间:2019-07-03 20:37:22

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

考虑以下代码:

match /shocking_contents_main_app/{shocking_content_main_app} {  // Do not specify any read/update/delete rules - OK, last check 2019/06/03
    allow create: if request.auth.uid != null && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.can_report_shocking_content == true 
                            && 
                exists(/databases/$(database)/documents/users/$(request.resource.data.reported_account_id))
                && 
                request.resource.data.reported_login == get(/databases/$(database)/documents/users/$(request.resource.data.reported_account_id)).data.login;
}

这些规则是在报告一些令人震惊的内容的背景下设置的。

最后一行检查报告的登录名是否等于报告的用户ID的登录名。 “问题”如下:路径$(request.resource.data.reported_account_id)下的文档/databases/$(database)/documents/users/不存在。如果不存在,Firestore安全规则会拒绝查询(预期行为)吗?换句话说:我必须使用exists(...)吗?

第一行提供了另一个示例:我检查登录用户是否可以报告其他人的内容(get(/databases/$(database)/documents/users/$(request.auth.uid)).data.can_report_shocking_content == true)。但是我不使用exists(...)

1 个答案:

答案 0 :(得分:1)

如果get()调用失败,则整个检查将变为false。重要的是要意识到,即使allow条件中只有一个子句失败,整个条件也会失败。

因此,此规则将返回true

allow read: if true || false;

但是下一条规则将失败:

allow read: if true || get(document_that_does_not_exist);

如果在文档不存在时可能希望得到积极的结果,则确实需要首先使用exists()检查它是否存在。

因此,它将再次返回true

allow read: if true || exists(document_that_does_not_exist);