我可能对firestore安全规则的语法有一些问题,因为我认为我的数据库结构背后的逻辑是正确的,安全规则也应该是正确的。
所以结构如下。我有一个“用户”的集合,他们是买家或卖家(手表说)。还有一系列“手表”。在手表内部,卖家可以创建包含手表细节和卖家ID的文件。
“watch”中的文档有一个名为“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
指的是来自客户端的内容,而不是文档中的现有数据。如果您希望auth'd用户能够仅将状态从现有值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
(新文档数据)之间的区别。