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

时间:2017-10-06 13:07:26

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

我无法弄清楚如何在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"]

感谢您的帮助。

3 个答案:

答案 0 :(得分:11)

您可以将规则分开,以包含不同的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;

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

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

使用size()可以确保确切的字段数。将其与hasOnly()结合使用可以将其锁定到这些特定字段。

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