Firestore

时间:2017-10-15 20:28:39

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

在实时数据库中,对单个值调用更新时,如果未在请求中指定,则安全规则将评估数据库中存在的值。

在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;
}

根据此安全规则,当我最初提供activeTerminalallowedTerminal值时,我可以成功创建新订阅,但如果我想更新activeTerminal值,我必须提供allowedTerminal值也可以,或者更新会返回权限被拒绝错误。

1 个答案:

答案 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;

您可能希望为createupdatedelete制定单独的规则:

allow create: if isMyCustomObject(request.resource.data);
allow update: if isUpdateToMyCustomObject(request.resource.data);
allow delete: if ...

你可以在the docs中阅读更多相关内容(很遗憾,这部分内容已被推到目前为止!)