首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能在Firestore中读取文档,然后锁定它,这样其他人就无法读取它了?

问是否有可能在Firestore中读取文档,然后锁定它,这样其他人就无法读取它了?
EN

Stack Overflow用户
提问于 2019-03-30 19:58:27
回答 2查看 599关注 0票数 2

我正在开发一个应用程序,用户可以在其中旋转一个幸运轮。当他们幸运,得到一个特定的领域,他们可以赢得一张优惠券。

我想用以下属性将这些优惠券存储在Firestore中:

代码语言:javascript
复制
{
"code" : 381939,
"expire_date" : xxx,
"value" : 5,
"currency" : "EUR"
}

我的想法是,当某人转动命运轮时,就会从数据库中随机选择一张优惠券/文件。如果没有任何优惠券,那么命运之轮就应该是静止的。因此,我想我需要放置一个按钮“检查优惠券的可用性”,或者类似的检查是否还有剩余的优惠券。当有任何一个,车轮将被设置为活动。

然后有两种情况: 1)他们赢了:优惠券将分配给用户并从数据库中删除2)他们松散:优惠券将存储在数据库中。

不幸的是,当很多用户想同时使用幸运轮时,我不认为这会很好,因为多个用户可以阅读相同的文档/优惠券。

那么,是否有可能“锁定”一个文档,让其他人在读完文档之后再读它呢?或者如何确保每个用户从数据库中读取不同的优惠券/文档,这样就不会有用户共享这个优惠券了?

希望你能理解我的问题。

如果你需要更多的信息,就告诉我。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-30 20:07:05

您可以使用的服务器端安全规则限制对文件的访问。由于您讨论的是将优惠券/文档与用户关联起来,所以这也是对您的安全规则建模的一个很好的方法。

例如,假设您使用用户的UID向文档中添加了一个owner字段,如果他们已经声明了优惠券:

代码语言:javascript
复制
{
  "code" : 381939,
  "expire_date" : xxx,
  "value" : 5,
  "currency" : "EUR"
  "owner" : "uidOfOwner"
}

现在我们要确保:

  1. 用户只能在文档没有所有者或者是所有者的情况下才能读取文档。
  2. 只有在文档还没有所有者的情况下,用户才能写入文档。

我们可以通过这些规则来做到这一点:

代码语言:javascript
复制
match /databases/{database}/documents {
  match /coupons/{coupon} {
    allow read: if !resource.data.keys().hasAll(['owner']) || resource.data.owner == request.auth.uid;
    allow write: if !resource.data.keys().hasAll(['owner']);
  }
}

这里有几件事要注意:

  • 使用上述规则,您可以控制对单个文档的访问,但用户将无法再读取/查询整个coupons集合。如果您仍然希望允许这样做,请查看保护查询。
  • 有了上述规则,用户可以在没有所有者(或其所有者)的情况下修改文档中他们想要的任何内容。您可能希望进一步限制写权限,以便用户只能编写所有者字段。请在检查字段是否已被修改上看到这个答案。
票数 2
EN

Stack Overflow用户

发布于 2019-03-30 20:33:09

我认为您应该使用防火墙云功能来解决安全问题,因为您的用户不应该能够在优惠券上写东西。当用户获胜时,调用一个云函数,该函数将向可用的优惠券随机添加一个ownerId:

代码语言:javascript
复制
{
  "code" : 381939,
  "expire_date" : xxx,
  "value" : 5,
  "currency" : "EUR"
  "owner" : "ownerId"
}

在客户端,您可以侦听将获得与用户关联的优惠券的查询。这样,当用户获胜时,将通过您的侦听器通知他。

不要忘记添加安全规则,这样您的用户只能获得与其关联的优惠券:

代码语言:javascript
复制
 match /databases/{database}/documents {
      function authenticated() { return request.auth.uid != null }
      function isMyCoupons () { return request.auth.uid == resource.data.owner }

      match /coupons/{coupon} {
        allow read: authenticated() && isMyCoupons();
      }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55435205

复制
相关文章

相似问题

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