我正在开发一个应用程序,用户可以在其中旋转一个幸运轮。当他们幸运,得到一个特定的领域,他们可以赢得一张优惠券。
我想用以下属性将这些优惠券存储在Firestore中:
{
"code" : 381939,
"expire_date" : xxx,
"value" : 5,
"currency" : "EUR"
}我的想法是,当某人转动命运轮时,就会从数据库中随机选择一张优惠券/文件。如果没有任何优惠券,那么命运之轮就应该是静止的。因此,我想我需要放置一个按钮“检查优惠券的可用性”,或者类似的检查是否还有剩余的优惠券。当有任何一个,车轮将被设置为活动。
然后有两种情况: 1)他们赢了:优惠券将分配给用户并从数据库中删除2)他们松散:优惠券将存储在数据库中。
不幸的是,当很多用户想同时使用幸运轮时,我不认为这会很好,因为多个用户可以阅读相同的文档/优惠券。
那么,是否有可能“锁定”一个文档,让其他人在读完文档之后再读它呢?或者如何确保每个用户从数据库中读取不同的优惠券/文档,这样就不会有用户共享这个优惠券了?
希望你能理解我的问题。
如果你需要更多的信息,就告诉我。
发布于 2019-03-30 20:07:05
您可以使用的服务器端安全规则限制对文件的访问。由于您讨论的是将优惠券/文档与用户关联起来,所以这也是对您的安全规则建模的一个很好的方法。
例如,假设您使用用户的UID向文档中添加了一个owner字段,如果他们已经声明了优惠券:
{
"code" : 381939,
"expire_date" : xxx,
"value" : 5,
"currency" : "EUR"
"owner" : "uidOfOwner"
}现在我们要确保:
我们可以通过这些规则来做到这一点:
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集合。如果您仍然希望允许这样做,请查看保护查询。发布于 2019-03-30 20:33:09
我认为您应该使用防火墙云功能来解决安全问题,因为您的用户不应该能够在优惠券上写东西。当用户获胜时,调用一个云函数,该函数将向可用的优惠券随机添加一个ownerId:
{
"code" : 381939,
"expire_date" : xxx,
"value" : 5,
"currency" : "EUR"
"owner" : "ownerId"
}在客户端,您可以侦听将获得与用户关联的优惠券的查询。这样,当用户获胜时,将通过您的侦听器通知他。
不要忘记添加安全规则,这样您的用户只能获得与其关联的优惠券:
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();
}
}https://stackoverflow.com/questions/55435205
复制相似问题