当前位置: 首页 > 知识库问答 >
问题:

当允许更新时,如何保护Firestore文档上的字段?

贝财
2023-03-14

使用Firebase Firestore,我将聊天室的详细信息存储在包含以下数据的文档中:

roomName
roomAvatar
createDate
isDeleted

我的应用程序和规则要求在“创建”文档时设置这些字段。但是,我也希望允许授权用户“更新”文档。

我已经进行了检查,只允许某些用户更新文档,并验证他们不允许修改“createdate”这样的字段。但是,我似乎无法创建一个规则来强制授权用户不删除“createdate”字段,无论是通过传递filedvalue.delete()还是使用ref.set(objectMissingCreateDate)。

allow update: if isAuthenticated() && isMemberOfRoom() && 
  (
    (!("roomName" in request.resource.data) || 
      request.resource.data.roomName == resource.data.roomName || 
      hasRoomPermission("UpdateRoom")) &&
    (!("roomAvatar" in request.resource.data) || 
      request.resource.data.roomAvatar == resource.data.roomAvatar || 
      hasRoomPermission("UpdateRoom")) &&
    (!("createDate" in request.resource.data) || 
      request.resource.data.createDate == resource.data.createDate) &&
    (!("isDeleted" in request.resource.data) || 
      request.resource.data.isDeleted == resource.data.isDeleted || 
      hasRoomPermission("DeleteRoom"))
  );

共有1个答案

于正志
2023-03-14

在道格和帕夫评论的帮助下,我意识到我做错了什么。

首先,我不知道一个只传递了几个字段的更新(或带有合并选项的集合)会导致从数据库的resource复制request.resource中的其余字段。

其次,request.resource缺少现有文档字段的唯一方法是设置(不包含merge)或传入fieldvalue.delete()

allow update: if isAuthenticated() && isMemberOfRoom() && 
  (
    ("roomName" in request.resource.data && 
      (request.resource.data.roomName == resource.data.roomName || 
      hasRoomPermission("UpdateRoom"))) &&
    ("roomAvatar" in request.resource.data && 
      (request.resource.data.roomAvatar == resource.data.roomAvatar || 
      hasRoomPermission("UpdateRoom"))) &&
    ("createDate" in request.resource.data && 
      request.resource.data.createDate == resource.data.createDate) &&
    ("isDeleted" in request.resource.data && 
      (request.resource.data.isDeleted == resource.data.isDeleted || 
      hasRoomPermission("DeleteRoom")))
  );
 类似资料:
  • 验证后,我试图在/users/处查找用户文档,然后我想使用auth对象中的数据以及一些自定义用户属性更新文档。但我得到一个错误,更新方法不存在。有没有办法更新单个文档?所有firestore文档示例都假定您拥有实际的文档id,并且没有任何示例使用where子句进行查询。

  • 假设我有一个Foo类和一个jax-rs FooResource,它将API公开给CRUD Foos。 Foo表示MongoDB文档。 在FooResource中,我将有如下内容: 问题是,json中的foo对象将只包含已经更改的字段,但我从来不知道它将是什么字段。 我使用带Panache扩展的Quarkus,我看到的唯一方法是从DB检索实体,然后检查从http请求接收到的foo对象中的每个字段,看

  • 问题内容: 我有这个POJO课: 这是我的数据库: 有100名学生,有些活跃,有​​些则没有。我想让所有学生都不活跃。 码: 如何使用POJO 更新为false?谢谢! 问题答案: 您可以通过非常简单的方式解决此问题。除了getter之外,还应该像这样为您的属性创建一个setter : 创建了setter之后,就可以像这样直接在对象上使用它: 该代码的结果将是将所有学生对象的active属性更新为

  • 假设我有 100 个带字段的文档 地址 现在假设我的业务模式正在改变,我想添加新的现场呼叫。 如何在所有100个文档中添加?NoSQL数据库上有这样的东西吗?

  • 我有一个firestore文档要更新。这是我的密码- 我正在对“merge:true”对象使用“set”方法。因为如果不存在,我想创建一个新文档,如果存在,我想更新数据。 我试图更新的文档正在被我发送的新属性重写,而不是将数据附加到现有文档中。我读到,使用{merge:true}将传入数据与当前数据合并,但这不起作用。我的整个文档正在被新数据替换。 这是我第一次创建文档时的firestore集合-

  • 我有这个POJO类: 这是我的数据库: 有100名学生,有些是活跃的,有些不是。我想让所有学生都不活跃。 法典: 如何使用POJO将更新为假?谢谢!