#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 безоговорочно обходит все правила безопасности. Правила применяются только к мобильным и веб-клиентам. Вам нужно будет проверить в самом коде, все ли он делает правильно.