Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase Firestore安全性-仅允许已知字段_Firebase_Firebase Security_Google Cloud Firestore - Fatal编程技术网

Firebase Firestore安全性-仅允许已知字段

Firebase Firestore安全性-仅允许已知字段,firebase,firebase-security,google-cloud-firestore,Firebase,Firebase Security,Google Cloud Firestore,我不知道如何在Firestore中正确设置“.validate”规则。 基本上,我希望允许用户文档只包含我知道的字段: user { name: "John" phone: "2342222" address: "5th Avenue" } 除了上面的3个字段(姓名、电话、地址),我不需要任何其他字段 不会同时保存这些字段姓名和电话将首先保存,地址将仅在用户想要编辑其个人资料时保存 我尝试了以下规则,但似乎不起作用: allow read: if request.auth.uid ==

我不知道如何在Firestore中正确设置“.validate”规则。 基本上,我希望允许用户文档只包含我知道的字段:

user {
 name: "John"
 phone: "2342222"
 address: "5th Avenue"
}
除了上面的3个字段(姓名、电话、地址),我不需要任何其他字段

不会同时保存这些字段姓名和电话将首先保存,地址将仅在用户想要编辑其个人资料时保存

我尝试了以下规则,但似乎不起作用:

allow read: if request.auth.uid == uid;
allow write: if request.auth.uid == uid && 
 request.resource.data.keys() in ["name", "phone", "address"]

谢谢您的帮助。

您正在查找
size()
hasOnly()
方法

allow write: if request.resource.data.size() == 3 
             && request.resource.data.keys().hasOnly(['name', 'phone', 'address'])
使用
size()。将其与
hasOnly()
相结合,可以将其锁定到那些特定字段


您可以在参考文档中阅读更多内容。

您可以将规则分开,以包括不同的
创建
更新
(以及
删除
)逻辑:


要补充Mike McDonald的答案,检查特定密钥,现在的表单是:

request.resource.data.keys().hasAll
而不是

request.resource.data.hasAll
完整示例:

// allows for creation with name and phone fields
allow create: if request.resource.data.size() == 2
              && request.resource.data.keys().hasAll(['name', 'phone'])
              && request.resource.data.name is string
              && request.resource.data.phone is string;
// allows a single update adding the address field
// OR (||) in additional constraints
allow update: if request.resource.data.size() == resource.data.size() + 1
              && !('address' in resource.data)
              && request.resource.data.address is string;

更多信息请点击此处:

嗨,丹,谢谢你的回复。这不起作用,因为这些字段不会同时保存。姓名和电话将首先保存,地址将稍后保存。因此,当我试图只保存“地址”时,规则将失败。我基本上是在尝试实现与实时数据库中相同的规则:“name”:{.validate:true},“phone”:{.validate:true},“address”:{.validate:true},$other”:{.validate:false}我不相信这些规则做了您期望它们做的事情。RT DB不区分创建、更新和删除(它们都是集合),因此当您强制执行只能写入多个属性时,您没有说明这些属性的更新顺序。目前,您需要对键而不是数据进行操作。现在正确的条件是'request.resource.data.keys().size()==3&&request.resource.data.key()s.hasAll(['name','phone','address'])你好,Dan,我只想让你知道这些规则集不起作用,实际上仍然很容易被滥用。理由是,在创建时,必须指定所有三个字段(姓名、电话、地址),但在更新时,我可以给出任意三个字段(年龄、密码、角色),并且此规则将通过,因为文档已经包含它正在检查的三个字段。要解决这个问题,只需使用hasOnly而不是hasAll,但这样你就限制了你可以在文档中存储的其他字段,而不是用户可以发送的内容。酷!虽然这不像我以前的实时数据库规则那么简单,但它是唯一能够实现这个想法的规则。如上所述,您的RTDB规则无法完成此行为。如何设置删除字段值的安全规则?@Vishu您可以使用
allow delete
delete帮助删除包含所有字段的整个文档。我只想删除文档中的一个特定字段,为此我使用了以下代码updates.put(“大写”,FieldValue.delete());但如何为此设置安全规则?
// allows for creation with name and phone fields
allow create: if request.resource.data.size() == 2
              && request.resource.data.keys().hasAll(['name', 'phone'])
              && request.resource.data.name is string
              && request.resource.data.phone is string;
// allows a single update adding the address field
// OR (||) in additional constraints
allow update: if request.resource.data.size() == resource.data.size() + 1
              && !('address' in resource.data)
              && request.resource.data.address is string;