【问题标题】:How to properly implement firestore database rules to prevent update to data when certain field changed?如何正确实施firestore数据库规则以防止在某些字段更改时更新数据?
【发布时间】:2019-07-18 21:24:29
【问题描述】:

我正在构建一个 NodeJS Express 应用程序并使用 Firebase 作为后端。我正在尝试保护我的 firebase 后端,更具体地说是使用 Firestore 安全规则的 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 不等于新的,我希望对 goalProgressReport 集合中的文档的任何更新都应该被拒绝。然而,这种情况并非如此。我可以提供一个新的 targetGoalId,但它会错误地更新。
此外,即使我使用安全规则尝试这样的事情:

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

我仍然可以写入数据库,尽管根据我的理解,这条规则不应该允许对数据库进行任何读取或写入。我对安全规则如何工作的理解不正确吗?如果 targetGoalId 已更改,如何修复我的 goalProgressReport 安全规则以不允许更新?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 就是这样,我正在使用 Firebase Admin SDK。我正在尝试使用 Firebase + Express 开发应用程序的后端,并且想以某种方式使用安全规则作为附加验证。您是否认为我需要在后端使用 JSON 验证器自己验证该信息,或者是否有办法为 Admin SDK 设置安全规则?
    • 很遗憾,您不能在此处使用安全规则。相反,您应该验证后端代码中的数据。人们正在考虑服务器端规则可能是什么样子,但不要为此屏住呼吸。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    • 2022-01-25
    • 2021-07-12
    • 2020-09-09
    • 2020-05-07
    • 1970-01-01
    相关资源
    最近更新 更多