【问题标题】:How to set Firebase rules that allow authenticated users to only read and write their own data?如何设置 Firebase 规则以允许经过身份验证的用户仅读取和写入自己的数据?
【发布时间】:2023-03-13 12:37:01
【问题描述】:

我的数据库结构是:

users
  david@gmail.com
    records
      ApK2DFpG87NDGYutgAVO
        pulse: 80
      Bryd87NAS20dfDGYtghg
        pulse: 78
  eva@fb.com
    records
      A81hxASDKH38dhaj9321
        pulse: 93
      A82ndasklih38ASD2eda
        pulse: 67

规则如下:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{email} {
      allow create, read, update, delete: if request.auth.token.email == email;
    }
  } 
}

我希望每个用户(例如foo@gmail.com)能够仅在该用户(users/foo@gmail.com/**)下读写数据。

当我在规则操场上阅读 users/me@gmail.com 时(同时被验证为 me@gmail.com),我得到“允许模拟读取”,正如预期的那样。

但是,当我从我的应用程序中读取users/me@gmail.com/records(同时被验证为me@gmail.com)时,我得到:

FirebaseError:权限缺失或不足。

我错过了什么?

顺便问一下,为什么规则游乐场不允许阅读集合(例如users/me@gmail.com/records)?它说:

路径必须是文档级的

【问题讨论】:

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


    【解决方案1】:

    您应该利用安全规则版本 2 的递归通配符,如下所示:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /users/{email}/{document=**} {
          allow create, read, update, delete: if request.auth.token.email == email;
        }
      } 
    }
    

    doc 中所述,它将匹配users 集合的任何子集合中的文档以及users 集合中的文档。


    顺便问一下,为什么规则游乐场不允许阅读合集

    如果我没记错的话,这是因为rules are not filters,因此您需要在“Rules Playground”中准确指定要定位的文档。

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 2017-07-25
      • 2020-03-06
      • 2016-04-22
      • 2021-05-18
      • 2018-10-25
      • 1970-01-01
      • 2017-11-15
      • 1970-01-01
      相关资源
      最近更新 更多