在Firebase Firestore中,有没有办法将信息传递给不属于路径的安全规则?

时间:2018-03-05 15:50:56

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

我想向Firestore数据库(Firebase)发送一些信息,最好是键值对(但不一定),这样它就可以用它来评估规则中的访问权限(在读取和写入时)。

但是,我不希望这些信息成为路径的一部分。

例如,假设我有一些passParameters方法:

DocumentReference docRef = 
      db.collection("cities")
        .document("SF")
        .passParameters("abc", 123);

然后我可以在编写规则时访问此信息,如下所示:

service cloud.firestore {
  match /databases/{database}/documents/cities/SF/ {
    allow read, write: if request.parameters.abc == 123;
  }
}

请注意,以上只是一个例子。现实生活中的用例更复杂。换句话说,不要过多关注示例本身,但回答更通用的问题:有没有办法将信息传递给不属于路径的安全规则?

2 个答案:

答案 0 :(得分:1)

不支持。它不会是一个非常安全的"安全规则,如果客户端只需指定查询所需的任何安全参数。这与允许客户端传递明文密码以使某人能够访问某些内容完全没有什么不同。我希望攻击者可以发现这类信息。

答案 1 :(得分:1)

您可以使用自定义令牌发送此类参数。在自定义令牌中包含这些值作为声明,并在向firestore(或signin)发送请求时在您的客户端中使用该令牌。

This link解释如何 -  1)创建自定义令牌,2)在这些令牌中包含自定义声明,以及3)在安全规则中访问这些声明。

您可以使用云功能生成具有特定用户自定义声明的自定义标记。

如果您希望作为参数 传递给firebase的信息经常更改 ,那么每次您想要更改参数值时,这将是一个云函数调用正在过去 - 所以有点贵。但是如果参数往往变化不那么频繁(比如某个角色或用户拥有的特权),那么这个解决方案应该是完美的,这是自定义令牌的主要好处之一。

尽管它并不像你的示例期望片段那么简单,但我相信这仍然是达到你想要的一种方式。