【问题标题】:simple security rule to read a given document读取给定文档的简单安全规则
【发布时间】:2020-02-23 08:58:45
【问题描述】:

我因访问简单集合而被拒绝模拟读取

Data Model:
/users/$userId/

这是一个简单的集合,没有子集合。

在我的模拟器中,我正在获取单个文档

/databases/users/documents/0011476476904

使用以下身份验证负载

{
  "uid": "0011476476904",
  "token": {
    "sub": "0011476476904",
    "email": "",
    "email_verified": false,
    "phone_number": "",
    "name": "",
    "firebase": {
      "sign_in_provider": "google.com"
    }
  }
}

如果 auth.uid 与 userId 匹配,我有一个简单的规则允许读取,但我仍然收到模拟规则被拒绝

rules_version = '2';
service cloud.firestore {
  match /databases/users/documents/{userId} {

      allow read, write: if userId == request.auth.uid;

  }
}

我设置规则的方式有什么问题吗?

【问题讨论】:

    标签: firebase firebase-authentication firebase-security


    【解决方案1】:

    如果您有一个 users 集合,您应该建模/定义您的安全规则的方式如下:

    service cloud.firestore {
      match /databases/{database}/documents {
    
        // Match any document in the 'users' collection
        match /users/{userId} {
             allow read, write: if userId == request.auth.uid;
        }
      }
    }
    

    有关详细信息,请参阅doc。此外,值得观看此文档中嵌入的视频page

    【讨论】:

    • 谢谢!我仍然收到一个模拟被拒绝的错误。
    • 可能是因为你在模拟器中使用了/databases/users/documents/0011476476904。你应该使用/databases/users/0011476476904
    • 嗯,好的。但是当我使用 /databases/users/0011476476904 它抱怨“路径必须是文档级”
    • 对不起,我的错误,你只需要使用users/0011476476904 而不使用databases。正如您在模拟器中的 Location 标题下看到的那样,模拟器已经考虑了“基本路径”(/databases/(default)/documents
    • 谢谢你的作品。我最后犯了一个非常菜鸟的错误。谢谢指点
    猜你喜欢
    • 1970-01-01
    • 2020-06-19
    • 2019-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-31
    • 2016-11-05
    • 2019-10-15
    相关资源
    最近更新 更多