我目前正在为我的应用程序编写一些使用Firestore数据库的规则。目前,每个人都可以读取数据,经过身份验证的用户可以写入。
match /quizzes/{quizId} {
allow read;
allow write: if request.auth != null;
}
这可以很好地工作,但我也希望未经身份验证的用户仅写入文档中的特定密钥。
文档的示例内容:
{
title: 'title',
plays: 12,
playedBy: [//Filled with user id's],
...
}
有没有办法限制未经身份验证的用户只能对playedBy数组进行写访问,而不能对该文档的其他密钥进行写访问?
发布于 2019-06-20 08:23:32
当然可以。但是如果你有很多字段,它可能会变得有点复杂。
让我们从最简单的例子开始。类似这样的代码允许未经身份验证的用户写入playedBy
,只要它是文档中唯一的字段:
if request.auth != null || request.resource.data.keys().hasOnly(['playedBy'])
如果未经身份验证的用户正在创建新文档或更新现有文档,则此方法有效。但是,一旦文档包含更多字段,它就会停止,因为request.resource.data
包含了写入成功后文档将具有的所有字段。
因此,更好的替代方法是检查是否只修改了playedBy
,以及所有其他字段是否具有与之前相同的值。这里的棘手之处在于处理字段的不存在,我通常使用几个辅助函数来处理:
function isUnmodified(key) {
return request.resource.data[key] == resource.data[key]
}
function isNotExisting(key) {
return !(key in request.resource.data) && (!exists(resource) || !(key in resource.data));
}
然后:
if request.auth != null &&
request.resource.data.keys().hasOnly(['title', 'plays', 'playedBy']) &&
isUnmodified('title') &&
isUnmodified('plays')
确切的规则可能有点离谱,但我希望这足以让您自己完成它。
https://stackoverflow.com/questions/56676255
复制相似问题