【问题标题】:Keep getting missing permission when trying to add to user only尝试仅添加到用户时不断丢失权限
【发布时间】:2018-08-12 19:00:38
【问题描述】:

我试图只允许对用户 UID 进行读/写,但是脚本一直说缺少权限,请帮忙。

非常感谢`

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid == userId;
    }
  }
}
db.collection('users').doc(userId).collection('details').add(...

【问题讨论】:

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


    【解决方案1】:

    您编写的规则仅匹配直接在称为“用户”的集合中的文档。但是,您正在尝试访问“用户”下文档的子集合中的文档。

    documentation 非常具体地解决了这种情况,因此请务必阅读并理解分层数据如何适用于安全规则。

    如果您想将每个用户的规则应用于集合中的所有文档,并且所有文档在该集合下的所有嵌套子集合中文档,你可以这么说:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{userId} {
          allow read: if request.auth.uid == userId;
          match /{document=**} {
              allow read: if request.auth.uid == userId;
          }
        }
      }
    }
    

    请注意,匹配必须像这样嵌套才能使用外部匹配中的userId 通配符。

    【讨论】:

    • 或简单地放在一行中。您不需要嵌套匹配,因为它两次检查相同,只需使用一行: users/{userId}/details/{detail} 。这在这里可能并不重要,但在您访问其他文档的检查中,Firestore 将每次读取计为单次读取,因此您将获得双重读取计数,这将花费您更多的钱。
    • @dAxx_ 这一行与用户集合中存在的文档不匹配。这里的嵌套是必需的,他们不会检查两次。这些规则没有任何成本。只有使用 get() 或 exists() 检查文档内容才会产生成本。
    • 它会起作用的。你仍然可以访问userId,看看我是怎么写的。正如我所说,它在这里可能不重要,但在其他情况下可能很重要(我说过。)
    • @dAxx_ 随意编写和测试您的规则并将其添加为此处的答案。确保它适用于 users 和 users/{userid}/subcollection 中的文档。
    • 我不需要测试它,我知道它可以工作,我不需要添加答案,因为你的答案已经足够好了。当规则稍微复杂一点时,我只是添加了一个旁注作为考虑。
    【解决方案2】:

    可能您忘记在 Firebase 控制台中启用登录提供程序。

    【讨论】:

      猜你喜欢
      • 2020-01-17
      • 2017-02-17
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-05
      • 2021-01-10
      相关资源
      最近更新 更多