我想向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;
}
}
请注意,上面只是一个例子。现实生活中的用例更复杂。换句话说,不要过多关注示例本身,但回答更通用的问题:有没有办法将信息传递给不属于路径的安全规则?
这不受支持。如果客户端可以通过查询指定它想要的任何安全参数,那么它将不是一个非常“安全”的安全规则。这与允许客户端传递明文密码以使某人能够访问某些内容完全没有什么不同。我希望攻击者可以发现这种信息。
您可以使用自定义令牌发送此类参数。在自定义令牌中包含这些值作为声明,并在向firestore(或signin)发送请求时在客户端中使用该令牌。
This link解释了如何 - 1)创建自定义令牌,2)在这些令牌中包含自定义声明,以及3)在安全规则中访问这些声明。
您可以使用云功能来生成具有特定用户的自定义声明的自定义标记。
如果您想要作为参数传递给firebase的信息经常更改,那么每次您想要更改正在传递的参数值时,这将是一个云函数调用 - 因此成本有点高。但是,如果参数往往不太频繁地改变(比如用户拥有的某个角色或特权),那么这个解决方案应该是完美的,这是自定义令牌的主要好处之一。
虽然它不像你的例子期望片段那么简单,但我相信这仍然是实现你想要的一种方式。