Firestore Security - 只允许已知字段
Firestore Security - allow only known fields
我不知道如何在 Firestore 中正确设置“.validate”规则。
基本上,我想让用户文档包含 仅 我知道的字段:
user {
name: "John"
phone: "2342222"
address: "5th Avenue"
}
除了上面的 3 个字段(姓名、phone、地址),我不需要任何其他字段。
字段不会同时保存。 name和phone会先被保存,address只有当user想编辑他的个人资料。
我已经尝试了以下规则,但似乎不起作用:
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()
结合使用可以将其锁定到那些特定字段。
您可以在 Cloud Firestore Rules 参考文档中阅读更多内容。
您可以将规则分开以包含不同的 create
和 update
(以及 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;
要添加到 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
我不知道如何在 Firestore 中正确设置“.validate”规则。 基本上,我想让用户文档包含 仅 我知道的字段:
user {
name: "John"
phone: "2342222"
address: "5th Avenue"
}
除了上面的 3 个字段(姓名、phone、地址),我不需要任何其他字段。
字段不会同时保存。 name和phone会先被保存,address只有当user想编辑他的个人资料。
我已经尝试了以下规则,但似乎不起作用:
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()
结合使用可以将其锁定到那些特定字段。
您可以在 Cloud Firestore Rules 参考文档中阅读更多内容。
您可以将规则分开以包含不同的 create
和 update
(以及 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;
要添加到 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