在实时数据库中,对单个值调用更新时,如果未在请求中指定,则安全规则将评估数据库中存在的值。
在Firestore中,我们必须为Firestore resource.data
中已存在的数据或请求request.resource.data
中的数据创建规则。
这使您必须使用或条件复制安全规则以检查当前数据,以便可以更新单个值。
构建安全规则的最佳方法是为一组数据值中的每一个指定单个条件,同时仍然允许对该数据的单个部分进行更新?
match /subscriptions/{uid} {
allow read: if request.auth.uid == uid;
allow write: if request.auth.uid == uid
&& request.resource.data.keys().hasAll(['allowedTerminals', 'activeTerminals'])
&& request.resource.data.allowedTerminals is int && request.resource.data.allowedTerminals > 0
&& request.resource.data.activeTerminals is int;
}
根据此安全规则,当我最初提供activeTerminal
和allowedTerminal
值时,我可以成功创建新订阅,但如果我想更新activeTerminal
值,我必须提供allowedTerminal
值也可以,或者更新会返回权限被拒绝错误。
答案 0 :(得分:1)
实时数据库和Firestore之间的行为实际上非常相似:
data == resource.data // data in the database
newData == request.resource.data // data in the incoming request
主要区别在于Firestore提供精细操作:
allow get, list; // same as allow read;
allow create, update, delete; // same as allow write;
您可能希望为create
,update
和delete
制定单独的规则:
allow create: if isMyCustomObject(request.resource.data);
allow update: if isUpdateToMyCustomObject(request.resource.data);
allow delete: if ...
你可以在the docs中阅读更多相关内容(很遗憾,这部分内容已被推到目前为止!)