Я настраиваю свои правила безопасности Firestore, но сталкиваюсь с одной проблемой, в которой я хочу ограничить обновление только одного определенного поля в документе с помощью функции hasOnly.Проблема в том, что я продолжаю получать «отклоненные» результаты, используя симулятор.Я, безусловно, делаю что-то простое неправильно ... Я пытаюсь предотвратить, чтобы кто-то мог обновить другие поля в документе, кроме update_requested_time
, но разрешить им обновлять это конкретное поле.
При использовании примераиз документации Firestore для hasOnly () - ['a', 'b'].hasOnly(['b', 'a']) == true
- правило возвращает true.Но при использовании моего собственного это не так, поэтому я предполагаю, что я получаю что-то не так в части request.resource.data.keys()
.
Определенных правил, нацеленных на поля в конкретном сценарии :
match /scenarios/{scenario} {
allow read: if true;
allow update: if request.auth.uid != null
&& request.resource.data.keys().hasOnly(['update_requested_time']) == true;
Отправляемый симулятором запрос (обновление с аутентификацией):
{"__name__":"/databases/(default)/documents/scenarios/test1","data":{"update_requested_time":"2019-02-05T11:00:00.000Z"}}
Мои полные правила:
service cloud.firestore {
match /databases/{database}/documents {
match /scenarios/{scenario} {
allow read: if true;
allow update: if request.auth.uid != null
&& request.resource.data.keys().hasOnly(['update_requested_time']) == true;
match /comments/{comment} {
allow read: if true;
allow create: if request.auth.uid != null;
allow delete,update: if request.auth.uid != null && request.auth.uid == resource.data.user;
}
match /outputs/{tile} {
allow read: if true;
}
match /mutations/{tile} {
allow read: if true;
allow create,update: if request.auth.uid != null;
}
}
match /users/{user} {
allow read: if true;
allow update: if request.auth.uid != null && request.auth.uid == user;
}
}
}
скриншот правил пожарного депо + симулятор