Google cloud firestore firestore安全规则的问题

Google cloud firestore firestore安全规则的问题,google-cloud-firestore,firebase-security,Google Cloud Firestore,Firebase Security,我可能对firestore安全规则的语法有一些问题,因为我认为我的数据库结构背后的逻辑是正确的,而且安全规则也应该是正确的 因此,结构如下。我收集了一些“用户”,他们要么是买家,要么是卖家(比如手表)。还有一组“手表”。在手表内部,卖家可以创建包含手表详细信息以及卖家id的文档 “watchs”中的文档有一个子集合,称为“status”。在“状态”中有一个单独的文档,该文档有一个字段,也称为“状态”,其值为0或1,0表示可供购买,1表示有人保留。安全规则是:只有监视文档的创建者可以更改该文档,并

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

因此,结构如下。我收集了一些“用户”,他们要么是买家,要么是卖家(比如手表)。还有一组“手表”。在手表内部,卖家可以创建包含手表详细信息以及卖家id的文档

“watchs”中的文档有一个子集合,称为“status”。在“状态”中有一个单独的文档,该文档有一个字段,也称为“状态”,其值为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)。代码有问题吗?

此规则:

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
(即新文档数据)之间的差异。

此规则:

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
(即新文档数据)之间的区别。

我明白了,您完全正确。现在我将其更改为“resource.data.status==0”,得到以下错误:Null值错误。这个错误对我来说真的没有意义,因为我在数据库中查找,确实有一个值为0的字段“status”…我明白了,你是完全正确的。现在我将其更改为“resource.data.status==0”,得到以下错误:Null值错误。这个错误对我来说真的没有意义,因为我在数据库中查找,确实有一个值为0的字段“status”。。。