考虑以下代码:
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(...)
。
答案 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);