Почему это правило безопасности Firestore не применяется?

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

#firebase #google-облако-firestore #firebase-безопасность

Вопрос:

У меня есть следующие правила Firestore. Я использую Admin SDK с ключом учетной записи службы для доступа к Firestore.

 service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user} {
      allow read, delete: if true;
      allow update, write: if getAfter(/databases/$(database)/documents/users/$(request.resource.id)).data.AccountId is int;
    }
  }
}
  

Я хочу принудительно использовать AccountId поле как int в users коллекции, но я все еще могу выполнять запись (и пакетную запись), где AccountId есть string .

Я пытаюсь проверить данные в каждом документе в users коллекции.

Вот код, который обновит user документ:

 try {
  await db.collection('users').doc('1').set({
    AccountId: '1234'
  })

} catch(e) {
  console.log(e)
}
  

Это не должно быть разрешено, поскольку AccountId не является int.

 try {
  await db.collection('users').doc('1').set({
    AccountId: 1234
  })

} catch(e) {
  console.log(e)
}
  

Это должно быть разрешено, поскольку AccountId является int.

Используя Admin SDK, я могу установить AccountId значение string .

РЕДАКТИРОВАТЬ: я обновил свои правила, и я все еще могу писать AccountId как string .

 service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user} {
        allow read: if true;
        allow create, update: if request.resource.data.AccountId is int;
    }
  }
}
  

Ответ №1:

Admin SDK безоговорочно обходит все правила безопасности. Правила применяются только к мобильным и веб-клиентам. Вам нужно будет проверить в самом коде, все ли он делает правильно.