我正在构建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安全规则以不允许更新?
答案 0 :(得分:1)
由于您在nodejs上运行,这意味着您正在使用Cloud Firestore节点SDK或包装了Cloud SDK的Firebase Admin SDK。在这种情况下,安全规则不适用。它们仅适用于直接来自Web和移动应用程序的访问,而不适用于来自服务器SDK的访问。服务器SDK始终绕过所有安全规则,因为它来自特权服务帐户。