Правило обновления Firestore вмешивается с Create - PullRequest
0 голосов
/ 06 сентября 2018

Я хочу, чтобы пользователи могли создавать сообщения (с помощью контактной формы), но не позволяли им читать или обновлять. Я добавляю новый контакт следующим образом:

app.firestore().collection("messages").add({
            name: this.state.name,
            subject: this.state.subject,
            message: this.state.message});

Со следующими правилами безопасности это разрешено:

match /messages/{message}{
    allow read, delete: if request.auth.uid=="<SOME_ID>";
    allow create: if true;
}

Но когда я добавляю правило обновления, как показано ниже, я получаю ошибку недостаточного разрешения при добавлении нового сообщения.

match /messages/{message}{
    allow read, delete, update: if request.auth.uid=="<SOME_ID>";
    allow create: if true;
}

Если переместить правило обновления ниже создания, это все равно не сработает. Но попытались установить обновление «всегда разрешать / true», после чего действие добавления снова работает.

Поэтому кажется, что Firestore каким-то образом смотрит на самое строгое правило из обновления и создает правила, но только если правило для обновления определено явно. Я что-то здесь не так делаю?

Редактировать:

match /messages/{message}{
allow read, delete: if request.auth.uid=="<SOME_ID>";
allow create: if true;  allow update: if false  }

Не приводит к проблемам с разрешениями. Таким образом, поведение кажется специфичным для типа проверки, которую я здесь делаю ..

1 Ответ

0 голосов
/ 06 сентября 2018

Для тех, кто столкнется с подобной проблемой в будущем. Проблема заключалась в том, что запрос не содержал свойство auth. По какой-то причине Firebase проверял условие для случая обновления и тестировал:

request.auth.uid=="<SOME_ID>"

В конце это должно было привести к ошибке: "попытка прочитать свойство с нулевым значением свойства" и произошел сбой.

function isAdmin() {
     return request.auth != null
            && request.auth.uid=="<SOME_ID>";
}
....
allow update: if isAdmin();

Решает

...