如何根据 firebase 中的父集合限制对子文档的访问

How to restrict access to subdocument based on parent collection in firebase

我有一个包含 2 个顶级集合(报告、用户)的 firestore 数据库。我的规则是这样设置的:

service cloud.firestore {
  match /databases/{database}/documents {
    match /reports/{report} {
        allow read: if request.auth != null && request.auth.uid == resource.data.userID;
      allow create: if request.auth != null && request.resource.data.userID == request.auth.uid;
      allow delete, update: if request.auth != null &&
      request.auth.uid == resource.data.userID;
    }
    match /users/{user}{
        allow read: if request.auth != null && request.auth.uid == resource.id; 
      allow create: if request.auth != null;
      allow delete: if request.auth != null && request.auth.uid == resource.id;
      allow update: if request.auth != null && request.auth.uid == resource.id;
    }
  }
}

我想在用户集合下创建一个子集合。这将包含该用户的默认设置。在我看来,规则是这样的:

match /users/{user}/defaultSettings/{document} {
   allow read, write: if request.auth != null && user.id == request.auth.uid
}

但是,我认为我不能在我的规则中使用 2 个占位符(用户和文档)。 Firestore 抱怨我使用 user.id

换句话说,我想要一个用户集合,任何经过身份验证的人都可以读取和写入,因为在注册后我创建了一个包含该用户信息的用户文档。我还想在每个用户下创建一个子集合,只有一个文档保存该用户的设置,我想将对该文档的访问限制为仅由父(用户)文档表示的用户。

我该怎么做?

只需将您的规则更改为:

match /users/{user}/defaultSettings/{document} {
   allow read, write: if request.auth != null && user == request.auth.uid
}

为了让您对 user 集合的规则更简单一些,您可以使用:

match /users/{user}{
    allow read: if request.auth != null && request.auth.uid == user; 
  allow create: if request.auth != null;
  allow delete: if request.auth != null && request.auth.uid == user;
  allow update: if request.auth != null && request.auth.uid == user;
}