【问题标题】:FireStore Rules : Read/Write user own documentFireStore 规则:读/写用户自己的文档
【发布时间】:2021-07-03 10:16:28
【问题描述】:

在 Firestore 我有 2 个集合

一个用户集合和一个周期集合。我的周期集合需要一个规则:只有创建周期的用户才能读写。

用户集合看起来像

periods 集合看起来像

这是我尝试但没有成功

service cloud.firestore {
  match /databases/{database}/documents {
    function userDoc() {
      return /databases/$(database)/documents/users/$(request.auth.uid);
    }

    match /users/{userId} {
      allow read: if true;
      allow create, update: if request.auth.uid == userId;
    }

    match /periods/{id} {
        allow read : if userDoc() == request.resource.data.user;
        allow write : if userDoc() == request.resource.data.user;
    }
  }
}

【问题讨论】:

  • 您可以仅将用户 UID 存储在期间文档中并使用 request.resource.data.user === request.auth.uid,还是我遗漏了什么?
  • 我试试这个。它不起作用。期间 user_id 等于 users/PdqJAiVsUDOQfCT5GA3jgOvQZQT2。查看我的示例数据
  • 那是因为request.auth.uid 只是PdqJAiVsUDOQfCT5GA3jgOvQZQT2 而不是/users 前缀。您可以添加另一个字段user_uid 并尝试一下吗?
  • 我正在尝试使用 userDoc() 函数获取前缀 users/ 但它不起作用;-(
  • 我只是试试这个:"users/${request.auth.uid}" == request.resource.data.user_id;但它没有用....

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


【解决方案1】:

替换

if userDoc() == request.resource.data.user

与

if userDoc() == request.resource.data.user_id

除了你的安全规则在我看来是正确的。

【讨论】:

  • 它适用于创建,更新,但读取/删除有问题:匹配 /periods/{id} {允许读取,删除:如果 userDoc() == request.resource.data.user_id;允许创建、更新:如果 userDoc() == request.resource.data.user_id; }
【解决方案2】:
  • 您的期间集合中不存在对象“request.resource.data.user”,因此应将其更改为“request.resource.data.user_id”。
  • 此外,读取和删除请求没有“request.resource”对象。所以对于读取和删除请求,‘request.resource.data.user_id’应该替换为‘resource.data.user_id’。
  • 我建议您对写入请求使用更精细的规则,即创建、更新、删除。有关 Firestore 规则的更多详细信息,您可以参考this link。

对于您的用例,请参阅以下 Firestore 规则示例。

service cloud.firestore {
  match /databases/{database}/documents {
    function userDoc() {
      return /databases/$(database)/documents/users/$(request.auth.uid);
    }

    match /users/{userId} {
      allow read: if true;
      allow create, update: if request.auth.uid == userId;
    }

    match /periods/{id} {
        allow read, delete : if userDoc() == resource.data.user_id;
        allow update : if userDoc() == request.resource.data.user_id;
        allow create : if userDoc() == /databases/$(database)/documents/$(request.resource.data.user_id.path);
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-02-07
    • 2020-10-23
    • 2018-09-11
    • 2019-12-31
    • 2021-06-10
    • 2020-07-28
    • 1970-01-01
    • 2019-09-10
    • 2018-09-29
    相关资源
    最近更新 更多