【问题标题】:Firestore security rules Multiple get() not working as expectedFirestore 安全规则多个 get() 未按预期工作
【发布时间】:2018-09-05 02:57:32
【问题描述】:

这些是我的 Firestore 安全规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /collectionA/{someID} {
         function checkA() {
            return get(/databases/$(database)/documents/collectionA/$(someID)/users/$(request.auth.uid)).data.deleteFlag != true
         }
         function checkB() {
            return get(/databases/$(database)/documents/collectionB/$(request.auth.uid)/companies/$(someID)).data.deleteFlag != true
         }
         allow read, write: if  checkA() || checkB()
    }
  }
}

这是我的数据库对象:

project {
  collectionA {
    companyA {
      users {
        r9Myn4TfzAVpSZGzyaet {
          deleteFlag: false
        }
      }
    }
  }
  collectionB {
    aAzUlfztdYdEIXT3Tva73kCiuy93 {
      companies {
        companyA{
          deleteFlag:false
        }
      }
    }
  }
}

我试过模拟器:

simulation type : get
location        : collectionA/companyA
provider        : password
Firebase UID    : aAzUlfztdYdEIXT3Tva73kCiuy93

我预计此安全规则会返回“true”。 因为我认为 checkA 返回“false”,而 checkB 返回“true”。 但他们返回“false”。

如果您有任何想法或建议,请告诉我。

【问题讨论】:

  • 您的问题的标题是建议单次获取可以,但多次获取不行?你试过把它们分开吗?
  • 是的,我的标题就是你所说的。我试过“允许读,写:如果checkA()”,它返回“假”。我尝试了“允许读取,写入:if checkB()”,它返回“true”。
  • 如果您确信它没有按您期望的方式工作,并且您有重现步骤来准确说明问题所在,请提交错误报告。 firebase.google.com/support/contact/bugs-features
  • 谢谢。我在这个网站上发现了同样的问题。它也没有解决。我要发送错误报告。

标签: firebase google-cloud-firestore firebase-security


【解决方案1】:

我听说模拟器有时不能正常工作。 我从客户端抛出查询并验证它并且它工作正常。 所以我认为这是模拟器中的一个错误。 但是,我收到了来自开发者平台支持的以下回复。

仅供参考

如果试图获取一个值,get 函数会出错 不存在的对象。当条件发生错误时 判断,安全规则不应用在安全规则中。 由于安全规则的规范,不可能 控制不存在的对象

【讨论】:

    猜你喜欢
    • 2020-10-30
    • 2018-08-12
    • 1970-01-01
    • 2018-04-16
    • 2019-07-28
    • 2019-01-29
    • 2018-03-19
    • 2021-05-12
    相关资源
    最近更新 更多