Firestore安全规则存在问题

时间:2019-03-23 19:52:34

标签: google-cloud-firestore firebase-security-rules

我可能对firestore安全规则的语法有一些疑问,因为我认为数据库结构背后的逻辑是正确的,并且安全规则也应该正确。

所以结构如下。我有一个“用户”集合,他们是买主或卖主(例如手表)。并且有“手表”的集合。在手表内部,卖家可以创建包含手表详细信息以及卖家ID的文档。

“监视”内的文档具有一个称为“状态”的子集合。在“状态”中只有一个文档,该文档具有一个也称为“状态”的字段,其值为0或1,0表示可以使用(用于购买),1表示由某人保留。安全规则是:只有监视文档的创建者才能更改该文档,并且(任何)买方只能在状态为0的情况下更改状态。

我认为以下应做的工作

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{$uid} {
      allow read, update: if request.auth.uid == $uid;
    }
    match /watches/{watchId} {
     allow read: if true;
     allow update: if request.resource.data.sellerId == request.auth.uid;
     match /status/{statusId} {
        allow read: if true;
      allow update: if request.resource.data.status == 0 && request.auth != null;
     }
    }
  }
}

我做了一些模拟,但从未允许我更改状态(我已登录并且状态为0)。代码有问题吗?

1 个答案:

答案 0 :(得分:2)

此规则:

allow update: if request.resource.data.status == 0 && request.auth != null;

如果用户已通过身份验证并且用户尝试将状态字段设置为0,则用英语说是允许对此文档进行更新。这与您在问题中所说的不同。请注意,request是指来自客户端 的内容,而不是文档中的现有数据。如果您希望经过身份验证的用户只能将状态从现有值0更改为新值1,那么您需要这样说:

allow update: if request.auth != null               // user is auth'd
              && resource.data.status == 0          // existing value is 0
              && request.resource.data.status == 1  // new value is 0

请注意resource.data(即现有文档数据)与request.resource.data(即新文档数据)之间的区别。