首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Cloud Firestore安全规则-仅允许写入文档中的特定密钥

Cloud Firestore安全规则-仅允许写入文档中的特定密钥
EN

Stack Overflow用户
提问于 2019-06-20 05:40:32
回答 2查看 954关注 0票数 3

我目前正在为我的应用程序编写一些使用Firestore数据库的规则。目前,每个人都可以读取数据,经过身份验证的用户可以写入。

  match /quizzes/{quizId} {
    allow read; 
    allow write: if request.auth != null;
  }

这可以很好地工作,但我也希望未经身份验证的用户仅写入文档中的特定密钥。

文档的示例内容:

{
  title: 'title',
  plays: 12,
  playedBy: [//Filled with user id's],
  ...
}

有没有办法限制未经身份验证的用户只能对playedBy数组进行写访问,而不能对该文档的其他密钥进行写访问?

EN

回答 2

Stack Overflow用户

发布于 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')

确切的规则可能有点离谱,但我希望这足以让您自己完成它。

票数 5
EN

Stack Overflow用户

发布于 2020-04-02 01:03:24

在之前的回答之后(我相信是2019年末),Firebase引入了Map.diff

类似于:

match /quizzes/{quizId} {
    allow read; 
    allow write: if request.auth != null ||
      request.resource.data.diff(resource.data).affectedKeys() == ["playedBy"].toSet()
  }

测试过的代码在我使用它的地方可以看到here

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56676255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档