【发布时间】:2018-08-06 07:32:03
【问题描述】:
我的团队最近讨论过这个问题,但似乎无法确定实际/预期的行为:
如果您有如下安全规则:
match /categories/{document=**} {
allow update: if request.auth.uid != null
&& request.resource.data.firstName is string
&& request.resource.data.lastName is string;
}
然后您使用以下数据创建从前端到 /categories/ 的更新语句:
{
firstName: 'A valid firstName'
}
那么安全规则应该通过还是失败?
开发人员提供的数据显示在 request.resource.data 中,其中 是包含字段和值的映射。未提供的字段 资源中存在的请求被添加到 request.resource.data
相关问题:
- 这是否意味着成功/失败取决于 节点?
- 如果有人尝试使用未更新的数据进行更新,会发生什么情况?
在安全规则中指定,即
{age: 28} - 什么是 验证更新数据的推荐方法?
更详细的问题 3(模式问题) 假设你有这样的模型:
interface Category {
firstName: string;
lastName: string;
age?: int;
groupId?: string;
}
现在我们创建一个像这样的安全规则:
match /categories/{document=**} {
allow update: if request.auth.uid != null
&& request.resource.data.firstName is string
&& request.resource.data.lastName is string;
&& request.resource.data.age is int;
&& request.resource.data.groupId is string;
}
没有一个场景适合可选属性。因为如果您必须提供所有属性(如场景 1 中),它并不是真正的可选属性。如果你不提供它们,就像在场景 2 中一样,它会失败。
也许我在这里遗漏了一些东西,关于如何使用写入 firestore 的可选属性来验证数据的基本指南?
可选参数的安全规则,如下所示:
match /categories/{document=**} {
allow update: if request.auth.uid != null
&& request.resource.data.firstName is string
&& request.resource.data.lastName is string;
&& request.resource.data.age is int; // ignore if NOT provided
&& request.resource.data.groupId is string; // ignore if NOT provided
}
【问题讨论】:
标签: firebase google-cloud-firestore firebase-security