Видны ли в базовом документе подколлекции в Firestore для чтения / записи? - PullRequest
1 голос
/ 13 марта 2020

Мне интересно, безопасно ли хранить конфиденциальные пользовательские данные в коллекциях документов (см. Структуру ниже) и использовать Firestore.rules (см. Правила ниже), чтобы запретить определенным c пользователям доступ к коллекции внутри документа? Если я выполню инструкцию get в пользовательском документе, будет ли доступна частная коллекция? Или он доступен только в том случае, если я вызову инструкцию get для документа address (например)?

Извините, если это где-то в Интернете, но я не смог найти окончательный ответ, и это несколько важно для целостности моего приложения. Я хотел получить хорошую идею, прежде чем реструктурировать свой бэкэнд.

Структура Firestore:

(collection) users: {
    (document) ID1234567890: {
        (collection) private: {
            (document) address: {
              line1: "",
              line2: "",
              city: "",
              state: "", 
              zip: "",
              country: "",
            },
            (document) billing: {
              ssnLast4: "",
              externalAccount: {},
            },
            (document) signatures: {
              ...
            }
        }
        id: "",
        userName: "",
        firstName: "",
        lastName: "",
        avatarUrl: "",
        ...
        phone: "",
        email: "",
    }
}

Firestore.rules:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    function isSignedIn() {
      return request.auth != null;
    }
    // Users collection // 
    // TODO: does this match give access to all sub collections?
    match /users/{userId} {
      function isTrueUser() {
        return resource.data.id == request.auth.uid;
      }
      // Anyone can create a user
      allow create: if true;
      // Only signed in users can read or list user profile data
      allow read, list: if isSignedIn();
      // Only that user can update their profile data
      allow update: if isSignedIn() && isTrueUser();
      // No one can delete a user
      allow delete: if false;
    }

    match /users/{userId}/private/{documentName} {
      function isTrueUser() {
        return userId == request.auth.uid;
      }
      // Only that signed in user can create, update, read, or list their private documents
      allow create, update, read, list: if isSignedIn() && isUserOwner();
      // No one can delete a private document
      allow delete: if false;
    }
  }
}

1 Ответ

1 голос
/ 13 марта 2020

Операции чтения в Firestore мелкие. Таким образом, чтение родительского документа не приводит к автоматическому считыванию данных из вложенных коллекций. Вам нужно будет выполнить отдельную операцию чтения для каждой вложенной коллекции.

Наличие доступа для чтения к родительскому документу также не означает автоматически, что вы можете прочитать вложенные коллекции этого документа. Вы можете защитить доступ к вложенным коллекциям в правилах безопасности.

Ваши текущие правила соответствуют только документам в коллекции /users:

match /users/{userId} 

Чтобы сделать так, чтобы они также соответствовали вложенным коллекциям (которые вы не хочет сделать), это должно быть:

match /users/{userId=**} 

Также см. Документацию Firebase по защите иерархических данных , в частности, по рекурсивные символы .

...