javascript - 如何正确实现 firestore 数据库规则以防止在某些字段更改时更新数据?

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

我正在构建一个 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/

相关文章:

javascript - 使用 Jade 的 :markdown filter? 时是否可以包含外部文件

firebase - 如何在 flutter 中将不同的数据类型添加到 firestore

来自后端的 Android 取消通知

node.js - Jest 模拟子模块功能

javascript - ChartJs 气泡图 - 悬停气泡变得太大

javascript - 从解构数组创建对象的片段

javascript - 如何为 node js npm 设置本地存储库?

javascript - 不使用参数和 this.push 的回调

javascript - 有时,当我刷新页面时,firebase.auth().onAuthStateChanged 会返回 null 用户

javascript - Socket.io 1.0 + express 4.2 = 无套接字连接