我目前正在使用 Firestore 数据库为我的应用程序编写一些规则。
目前,每个人都可以读取数据,经过身份验证的用户可以写入。
match /quizzes/{quizId} {
allow read;
allow write: if request.auth != null;
}
这工作正常,但我也希望未经身份验证的用户仅写入文档中的特定键。
文档内容示例:
{
title: 'title',
plays: 12,
playedBy: [//Filled with user id's],
...
}
有没有什么方法可以限制未经身份验证的用户只能对 PlayBy 数组进行写访问,而不能对该文档的其他键进行写访问?
当然可以。但如果你有很多字段,它可能会变得有点复杂。
让我们从最简单的例子开始。像这样的东西允许未经身份验证的用户编写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')
确切的规则可能有点偏差,但我希望这足以让您自己完成。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)