Правила безопасности Firestore: оценка входящих запросов по сравнению с другими документами в базе данных

# #firebase #google-cloud-firestore #firebase-security

Вопрос:

Я новичок в firestore и его правилах безопасности, поэтому приношу извинения, если это звучит глупо. У меня есть 3 коллекции, данные, роли и требования к обучению. В ролях я сохраняю идентификатор пользователя вместе с его именем и ролью, как показано на прикрепленном изображении. Что я хотел сделать, так это предоставить доступ для чтения и записи только в том случае, если роль пользователя является «внешней». Итак, для этой цели я написал следующее правило:

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    match /trainingRequests/{tId} {
        allow read, write: if get(/databases/$(database)/documents/roles).data[request.auth.uid].role == "external"
    }
    
  }
}
 

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

введите описание изображения здесь

Ответ №1:

Вам нужно передать методу путь к документу get() .

С

 get(/databases/$(database)/documents/roles)
 

на самом деле вы проходите roles путь сбора.


Следующее должно сделать свое дело:

 rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
  
    match /trainingRequests/{tId} {
        allow read, write: if get(/databases/$(database)/documents/roles/$(request.auth.uid)).data.role == "external"
    }
    
  }
}
 

get() Метод возвращает rules.firestore.Resource значение, для которого вы вызываете data свойство, возвращающее карту данных документа.

Более подробную информацию и примеры вы найдете в документе.