【问题标题】:Firebase Cloud Firestore rule permits get but not listFirebase Cloud Firestore 规则允许获取但不允许列出
【发布时间】:2021-10-06 19:39:37
【问题描述】:

我正在尝试在 Cloud Firestore 中设置基于角色的身份验证。目的是对其进行设置,以便只有组织内的用户才能阅读组织或相关事件。它在客户端请求单个文档(get)而不是文档查询(list)时起作用。

我的名为 organizations 的集合看起来像这样,到目前为止只包含一个 ID 为 devtest 的文档:

{
  "name": "Dev Test"
  "users": [
    "STFg0EvGemTaD2r9jyby0UMSt6O2"
  ]
  "orgid": "devtest"
}

我也收藏了events(目前也只包含一个):

{
  "name": "foo",
  "orgid": "devtest",
  ...
}

我的规则是这样的:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    function isSignedIn() {
      return request.auth != null;
    }

    function userIsUser() {
      return isSignedIn() && 
      request.auth.uid in get(/databases/$(database)/documents/organizations/$(resource.data.orgid)).data.users;
    }
    
    match /organizations/{org} {
      allow read: if userIsUser();
      allow write: if false;
    }

    match /events/{event} {
      allow read: if userIsUser();
      allow write: if userIsUser();
    }

  }
}

我很困惑的是为什么我可以做一个 get 并且它成功了,例如:

firebase.firestore().collection('organizations').doc('devtest').get()

但是当我尝试查询时它会失败,例如:

firebase.firestore().collection('organizations').where('users', 'array-contains', firebase.auth().currentUser ? firebase.auth().currentUser.uid : false)

响应权限被拒绝。我知道安全规则不是过滤器,现在集合中只有一个文档。

对我可能遗漏的内容有什么建议吗?

谢谢!

【问题讨论】:

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


    【解决方案1】:

    根据documentation,使用身份验证对象会直接导致问题,因为它们可能处于中间状态。建议您还创建一个等待状态更改的身份验证侦听器。

    通过使用观察者,您可以确保 Auth 对象在获取当前用户时不处于中间状态(例如初始化)。当您使用 signInWithRedirect 时,onAuthStateChanged 观察者会等到 getRedirectResult 解决后再触发。

    如果在您的查询中发生这种情况,它可能会解释为什么它会给您权限错误,因为对象可能仍在初始化并解析为 false 而不是 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多