firebase 如何在Firestore安全规则中表示get-function调用?

wn9m85ua  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(123)

我已经设置了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.

非常感谢您的时间和您的帮助解决这个问题。

oymdgrw7

oymdgrw71#

如果Firestore安全规则有多个匹配项,则在任何条件为真时允许访问。
在您共享的代码中,这些行允许访问您的所有文档:

match /{document=**} {
  allow read, write: if true;

所以其余的条件都不重要。用户将能够读取和写入所有文档,无论它们是否满足您的附加条件。
请参阅官方Firestore安全规则文档了解更多信息:https://firebase.google.com/docs/firestore/security/rules-structure#overlapping_match_statements

相关问题