我已经设置了Firestore安全规则来有条件地读取数据,我发现尽管有条件,但不应该被读取的数据仍然被读取。
我相信我写的安全规则符合Firestore手册中给出的说明,所以我不确定如何解决这个问题。
你能看一下下面的细节并提供你的反馈吗?
我的安全规则是:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if true;
match /{users}/{eID} {
allow create, read: if false;
match/{userA}/{eID} {
allow read: if false;
match/{exclusiveA}/{preferredCurrency} {
allow read, get: if request.auth != null && get(/databases/$(database)/documents/users/
$(request.auth.uid)).data.creditCard == 'false' &&
get(/databases/$(database)/documents/users/
$(request.auth.uid)).data.currency == resource.data.preferredCurrency;
}
}
}
}
}
}
我的Firestore结构如下图所示:
这意味着要发生的是,要查看exclusiveA集合,但Firestore仅在以下字段的情况下向用户提供数据:preferredCurrency(在exclusiveA集合的字段内)和字段:currency(exclusiveB集合内)匹配。这将导致用户仅可读取一个文档。
规则的结果是,用户可以读取集合中的每个文档:
D/EGL_emulation(15692): app_time_stats: avg=3519.32ms min=63.38ms max=13687.19ms count=4
I/flutter (15692): The vehicle's maximum speed = 250.
I/flutter (15692): The vehicle's pulling strength = 500 bph.
I/flutter (15692): The vehicle's brand is CMW, and its model-name is K325S.
I/flutter (15692): The preferred currency = USD.
I/flutter (15692): The vehicle's maximum speed = 200.
I/flutter (15692): The vehicle's pulling strength = 500 bph.
I/flutter (15692): The vehicle's brand is Vercedes, and its model-name is QWE223.
I/flutter (15692): The preferred currency = GBP.
非常感谢您的时间和您的帮助解决这个问题。
1条答案
按热度按时间oymdgrw71#
如果Firestore安全规则有多个匹配项,则在任何条件为真时允许访问。
在您共享的代码中,这些行允许访问您的所有文档:
所以其余的条件都不重要。用户将能够读取和写入所有文档,无论它们是否满足您的附加条件。
请参阅官方Firestore安全规则文档了解更多信息:https://firebase.google.com/docs/firestore/security/rules-structure#overlapping_match_statements