我正在构建一个 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,我希望对 goalProgressReport 集合中的文档进行任何更新都应被拒绝。然而,这种情况并非如此。我可以提供新的 targetGoalId,但它更新错误。
另外,即使我尝试使用安全规则进行类似的操作:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false
}
}
}
我仍然可以写入数据库,尽管根据我的理解,此规则不应允许对数据库进行任何读取或写入。我对安全规则如何运作的理解是否不正确?如果 targetGoalId 发生更改,如何修复 goalProgressReport 安全规则以不允许更新?
最佳答案
由于您在 Nodejs 上运行,这意味着您正在使用 Cloud Firestore Node SDK 或封装 Cloud SDK 的 Firebase Admin SDK。在这种情况下,安全规则不适用。它们仅适用于直接来自 Web 和移动应用程序的访问,而不适用于来自服务器 SDK 的访问。服务器 SDK 始终绕过所有安全规则,因为它来自特权服务帐户。
关于javascript - 如何正确实现 firestore 数据库规则以防止在某些字段更改时更新数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57102809/