Firebase 编写云Firestore安全规则

Firebase 编写云Firestore安全规则,firebase,web,google-cloud-firestore,firebase-security,Firebase,Web,Google Cloud Firestore,Firebase Security,我正在使用Firebase Cloud Firestore创建一个web应用程序,我想写下我想象中的安全规则,但是我找不到关于这个主题的更好的文档,它总是很简单,比如检查用户是否登录 所以我要做的是检查客户端想要阅读的文章是否有一个名为public的属性,设置为true。也许我可以检查请求的来源,以确保它来自我的网站的url?我想找到一个解决方案,允许阅读而不需要用户登录,但也有最低限度的安全性 如果属性未定义,是否可以返回true?我想在默认情况下将文章设置为公共,但我不知道如何操作。我不确定

我正在使用Firebase Cloud Firestore创建一个web应用程序,我想写下我想象中的安全规则,但是我找不到关于这个主题的更好的文档,它总是很简单,比如检查用户是否登录

所以我要做的是检查客户端想要阅读的文章是否有一个名为public的属性,设置为true。也许我可以检查请求的来源,以确保它来自我的网站的url?我想找到一个解决方案,允许阅读而不需要用户登录,但也有最低限度的安全性


如果属性未定义,是否可以返回true?我想在默认情况下将文章设置为公共,但我不知道如何操作。

我不确定您是否可以仅将您的域列入白名单,但您可以使用安全规则完成几乎所有需要的操作

所以我要做的是检查客户端想要阅读的文章是否有一个名为public的属性,设置为true

我想找到一个解决方案,允许阅读而不需要用户登录


请记住,这些不应该用作过滤器,它们应该控制谁可以写/读东西

正如Frank所说,您不能限制从特定域访问Firestore。但是,由于您使用一些api密钥来调用firebase资源,所以需要将其分配到特定域。您可以通过转到GCP凭据页-->要限制的API密钥来执行此操作。从那里,你可以检索此密钥如何用于网站、应用程序等

关于检查Artie是否拥有公共财产的其他问题,可以使用以下安全规则轻松完成:

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

    
    match /articles/{articleId} {
       // I chose visibility as a prop here but it can be anything
       allow read: if resource.data.visibility == "public" 
    }
  }
}
要在默认情况下将文章设置为公共,您可以在创建文章文档时从客户端应用程序通过将属性(例如“可见性”)设置为公共来执行此操作。在您的应用程序中类似于以下内容:

// Add a new document with a generated id.
db.collection("articles").add({
    visibility: "public"
    ...
})

无法将Firestore访问限制到特定域。请参阅,如果属性public未定义,是否可以返回true?我想在默认情况下将文章设置为公共
service cloud.firestore {
  match /databases/{database}/documents {

    
    match /articles/{articleId} {
       // I chose visibility as a prop here but it can be anything
       allow read: if resource.data.visibility == "public" 
    }
  }
}
// Add a new document with a generated id.
db.collection("articles").add({
    visibility: "public"
    ...
})