如何正确实施Firestore数据库规则以防止在某些字段发生更改时更新数据?

时间:2019-07-18 21:24:29

标签: javascript node.js firebase google-cloud-firestore firebase-security-rules

我正在构建NodeJS Express应用,并使用Firebase作为后端。我正在尝试使用Firestore安全规则来保护我的Firebase后端,尤其是Firestore数据库。但是,我似乎无法触发我的安全规则。

我有一个名为/ api / goalPRs /:goalPRId的路由,该路由通过调用

用请求的主体更新数据库引用
const goalPRsRef = db.collection('goalProgressReports');
goalPRsRef.doc(goalPRId).update(newGoalPR).then(()=>({update: 'Success'}));

现在,每个goalPR都有一个名为targetGoalId的字段,我想要保持不变,但我不希望该数据可编辑。因此,我尝试设置以下Firestore安全规则。

service cloud.firestore {
  match /databases/{database}/documents {
    match /goalProgressReports/{goalPR} {
      allow update: if request.resource.data.targetGoalId == resource.data.targetGoalId;
    }
  }
}

使用此安全规则,我希望如果旧的targetGoalId不等于新的targetGoalId,则对targetProgressReport集合中的文档的任何更新都应被拒绝。然而,这种情况并非如此。我可以提供一个新的targetGoalId,它会错误地更新。
此外,即使我尝试使用安全规则进行以下操作:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
       allow read, write: if false
    }
  }
}

尽管我理解此规则不应允许对数据库进行任何读取或写入,但仍然可以写入数据库。我对安全规则如何工作的理解不正确吗?如果targetGoalId更改了,我如何解决我的GoalProgressReport安全规则以不允许更新?

1 个答案:

答案 0 :(得分:1)

由于您在nodejs上运行,这意味着您正在使用Cloud Firestore节点SDK或包装了Cloud SDK的Firebase Admin SDK。在这种情况下,安全规则不适用。它们仅适用于直接来自Web和移动应用程序的访问,而不适用于来自服务器SDK的访问。服务器SDK始终绕过所有安全规则,因为它来自特权服务帐户。