编写 Cloud Firestore 安全规则

时间:2021-01-10 11:16:38

标签: firebase web google-cloud-firestore firebase-security

我正在使用 Firebase Cloud Firestore 创建一个 Web 应用程序,我想编写我想象的安全规则,但我找不到关于这个主题的任何更好的文档,它总是很简单的事情,比如检查如果用户已登录。

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

如果属性未定义,是否有可能返回 true ?我想把文章默认设为公开,但不知道怎么做。

2 个答案:

答案 0 :(得分:1)

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

<块引用>

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

  allow read: if resource.data.yourPropertyName == "public" 
<块引用>

我想找到一种无需用户登录即可阅读的解决方案

allow read: if true;

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

答案 1 :(得分:0)

正如 Frank 所说,您不能限制从特定域访问 Firestore。但是,因为您使用一些 api 密钥来调用您的 firebase 资源,you can restrict the use of this key 到特定域。您可以通过转到 GCP 凭据页面 --> 要限制的 API 密钥来执行此操作。从那里你可以限制如何将此密钥用于网站、应用程序等。

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

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"
    ...
})