16

我不知道如何在 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"]

感谢帮助。

4

3 回答 3

17

您可以将规则分开以包含不同的createupdate(以及delete)逻辑:

// allows for creation with name and phone fields
allow create: if request.resource.data.size() == 2
              && request.resource.data.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;
于 2017-10-06T14:59:45.403 回答
11

您正在寻找size()hasOnly()方法。

allow write: if request.resource.data.size() == 3 
             && request.resource.data.keys().hasOnly(['name', 'phone', 'address'])

使用size()允许您确保准确的字段数量。将其与hasOnly()允许您将其锁定到那些特定字段。

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

于 2017-10-06T14:19:24.803 回答
6

要添加到 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;

更多信息在这里:https ://firebase.google.com/docs/reference/rules/rules.Map

于 2018-05-18T20:29:22.183 回答