首页 > 解决方案 > 有没有办法限制可以使用 Firebase 规则更改的值?

问题描述

我有一个 Firebase 文档(实际上,可能文档需要相同的东西),由于安全原因,我只允许从后端代码(又名 Firebase 函数)进行更新。我仍然希望连接的客户端能够读取这些数据,并在某些情况下更新数据,但仅限于有限的字段。

我当前的解决方案如下,基本上验证文档中的值不是请求中的更改。是的,这行得通,但我觉得这是有问题的,因为在添加新字段时很容易忘记更新规则,而且我还没有找到任何真正好的工具来编辑规则,这相当乏味。

这是我现在正在做的一个例子:

  allow update: 
    if request.auth != null &&
    request.auth.uid == resource.data.firebaseUID &&
      resource.data.pendingDelete == false &&
      // Some values are protected
      resource.data.creditBalance == request.resource.data.creditBalance &&
      resource.data.creditLimit == request.resource.data.creditLimit &&
      resource.data.firebaseUID == request.resource.data.firebaseUID &&
      resource.data.mostRecentTermsOfService == request.resource.data.mostRecentTermsOfService &&
      resource.data.mostRecentTermsOfServiceAccepted == request.resource.data.mostRecentTermsOfServiceAccepted &&
      resource.data.mostRecentTermsOfServiceAcceptedOn == request.resource.data.mostRecentTermsOfServiceAcceptedOn &&
      resource.data.promotionCreditBalance == request.resource.data.promotionCreditBalance &&
      resource.data.promotionCreditsExpiration == request.resource.data.promotionCreditsExpiration &&
      resource.data.registeredOn == request.resource.data.registeredOn &&
      resource.data.testRecord == request.resource.data.testRecord &&
      resource.data.userOwnedCompanyID == request.resource.data.userOwnedCompanyID;

当我混合用户角色时,这变得特别难看。如果有某种方式可以说只能更改 X 值,那就太好了,这可能吗?

我曾考虑过使用其中的许多:

!("creditLimit" in request.resource.data)

但这似乎不起作用(PERMISSION_DENIED),但并没有好多少,因为看起来我仍然需要单独列出我不希望客户更新的所有值

我浏览了几篇文章,但大多数似乎相对有限,并且大多数似乎期望客户可以更改几乎任何值,例如:

基本安全规则数据验证规则

标签: firebasegoogle-cloud-firestorefirebase-authenticationfirebase-security

解决方案


推荐阅读