Firebase读/写规则如何影响用户对查询的体验?

时间:2018-03-08 13:53:45

标签: firebase google-cloud-firestore

我已阅读Firebase文档,并想知道Firebase规则如何影响用户在应用中的体验。假设您根据Firestore规则与该群组分开,则只能访问群组。那么你是不是要查询member.uid == auth.uid所有的组(就像你没有规则一样),你会查询"组"集合,用户只会收到他们分开的群组?

每当我阅读有关Firestore规则的内容时,他们几乎都会给出相同的示例,而不会提供用户在查询数据库时会看到的内容的示例。如果有人可以指出我正确的方向,或者展示我如何测试这样的东西,那将非常感激。

2 个答案:

答案 0 :(得分:3)

  

那么你是不是要查询member.uid == auth.uid所有的组(就像你没有规则一样),你会只查询“groups”集合,而用户只会收到他们分开的组的?

Firebase规则无法过滤数据。您不能让客户端读取整个集合,然后期望规则返回该集合中的文档子集。

这样做的原因是只有在附加了侦听器/观察者之后才会对其进行验证,之后他们才能访问数据。为了使实时更新性能可以接受,这是必要的。

虽然无法使用规则来过滤数据,但可以使用它们来验证查询。有关此示例,请参阅Firestore documentation on securely querying data

service cloud.firestore {
  match /databases/{database}/documents {
    match /stories/{storyid} {
      // Only the authenticated user who authored the document can read or write
      allow read, write: if request.auth.uid == resource.data.author;
    }
  }
}

拒绝此查询:

// This query will fail
db.collection("stories").get()

但允许这一个:

var user = firebase.auth().currentUser;

db.collection("stories").where("author", "==", user.uid).get()

你可以看到我们基本上是从规则中的代码重复这个条件。这允许您基于(例如)用户的UID安全地公开集合中的文档子集。

答案 1 :(得分:0)

firebase规则只是为了防止应用程序中的垃圾邮件以及其他内容。

如果您使用read:truewrite:true,那么任何人都可以读取和写入数据库,这就是使用它的原因:

service cloud.firestore {
 match /databases/{database}/documents {
 match /{document=**} {
  allow read, write: if request.auth.uid != null;
  }
 }
}

这样,只有经过身份验证的用户才能看到从数据库中检索的数据,或者可以将数据发送到数据库。

如果您在群组中有用户并使用了此功能:

service cloud.firestore {
 match /databases/{database}/documents {

   // Match any document in the 'groups' collection
   match /groups/{group} {
      allow read, write: if true;
    }
  }
}

这意味着该组的所有成员都可以从该数据库中读取数据,因此如果您在该组中,则数据将显示在您的应用程序中。

更多信息:

https://firebase.google.com/docs/firestore/security/rules-structure