Правила Firestore
Правила безопасности Firestore определяют, кто и что вправе делать с вашими данными. Без них база открыта всем — любой, кто узнал параметры проекта, сможет читать и переписывать документы.
Например, правила позволяют разрешить создание записи только тем, кто вошёл в приложение — через почту, Google или другой способ входа.
Если с правилами Firestore вы раньше не работали, начните с вводной статьи Firebase.
Где задавать правила
Два варианта:
1. В настройках FlutterFlow
Базовые правила задаются прямо в билдере, в разделе Firestore Settings.
Как это устроено
Настраиваются четыре операции над документом:
- Create — создание документа в коллекции.
- Read — чтение документов.
- Write — изменение документа.
- Delete — удаление документа.

Для каждой операции доступны уровни доступа:
-
Everyone — все подряд, вошедшие и нет.
-
Authenticated Users — только те, кто вошёл в приложение: через почту, Google и так далее.
-
Tagged Users — только те, кто указан в самом документе. Скажем, в коллекции «posts» есть поле
created_byс автором записи; правило Tagged Users на этом поле разрешит читать, менять и удалять пост только его автору.

- Users Collection — доступ есть у пользователя, чей идентификатор совпадает с ID документа. Вариант имеет смысл только для коллекции «users».
- No One — операция запрещена всем.
Для Tagged Users в документе должно быть поле со ссылкой на пользователя или со строковым идентификатором.
Что применяется к новым коллекциям
Коллекция, созданная в Firestore Content Manager, получает такие правила:
- Create → Everyone — создавать документы может кто угодно.
- Read → Everyone — читать может кто угодно.
- Write → No One — изменять нельзя никому.
- Delete → No One — удалять нельзя никому.

На старте так удобно, но перед запуском приложения доступ к коллекциям с личными данными нужно закрыть. Чтобы про это не забыть, отметьте коллекцию флагом Has Private Data — билдер начнёт напоминать, что правила стоит ужесточить.
Пример: свежесозданная коллекция «notes» по умолчанию открыта на чтение всем, хотя читать заметку должен только её автор. Флаг Has Private Data выведет предупреждение, и правила можно будет поправить.

Нужен полный контроль над конкретной коллекцией — отметьте Exclude: FlutterFlow перестанет генерировать для неё правило, и вы напишете своё в консоли Firestore.
Правила вступают в силу только после выкатки. Нажмите Deploy — и они появятся в Firebase Console > Firestore Database > Rules.
Если вместе с пользователем нужно удалять и все связанные с ним записи, выберите для правила Delete уровень Tagged Users и включите соответствующую опцию каскадного удаления.
Пример
Настроим правила коллекции todos под такие требования:
- создавать задачу может только вошедший пользователь;
- видеть задачи может кто угодно;
- менять задачу может только её автор;
- удалять задачи нельзя никому.
Порядок действий:
- В секции Firestore Rules поставьте Create — Authenticated Users.
- Read — Everyone.
- Write — Tagged Users. Откроется окно Tag Users:
- Нажмите Unset и выберите поле со ссылкой на пользователя или его идентификатором.
- Нажмите Save Changes.
- Delete — No One.
- Выкатите правила.
Пример нарочно упрощён. Свои правила стройте от реальных требований приложения.
2. В консоли Firestore
Более сложные правила пишут прямо в консоли Cloud Firestore.
Возьмём ту же коллекцию todos, но требования жёстче:
- создать задачу может пользователь, который вошёл и подтвердил почту или телефон, и сама задача должна быть корректной;
- видеть задачи может кто угодно;
- менять задачу может только её автор, и только на корректные данные;
- удалять задачу может только её автор.
Что делать:
- Откройте консоль Firebase и выберите Firestore Database в меню слева.
- Перейдите на вкладку Rules.
- Вставьте код ниже и нажмите Publish.
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// 1.
function isSignedIn() {
return request.auth != null;
}
// 2.
function verified() {
return request.auth.token.email_verified || request.auth.token.phone_number;
}
// 3.
function isValidItem() {
return request.resource.data.name.size() > 0 ;
}
match /todos/{document} {
// 4.
allow create: if isSignedIn() && verified() && isValidItem();
// 5.
allow read: if true;
// 6.
allow write: if isValidItem() && resource.data.created_by == /databases/$(database)/documents/users/$(request.auth.uid);
// 7.
allow delete: if resource.data.created_by == /databases/$(database)/documents/users/$(request.auth.uid);
}
match /users/{document} {
allow create: if request.auth.uid == document;
allow read: if true;
allow write: if request.auth.uid == document;
allow delete: if false;
}
}
}
Что здесь происходит:
- isSignedIn() — вошёл ли пользователь.
- verified() — подтверждена ли почта или телефон.
- isValidItem() — не пустая ли задача.
- create — создавать можно, если пользователь вошёл, подтверждён и задача корректна.
- read — читать может кто угодно.
- write — менять может автор, и только на корректные данные.
- delete — удалять может только автор.
Выкатка правил
Нажмите Deploy.
Перед выкаткой билдер покажет, что изменилось: слева прежняя версия правил, справа новая. Проверьте и нажмите Deploy Now.
- Каждое изменение правил нужно выкатывать заново — само оно не применится.
- Перед публикацией приложения уберите правила тестового режима вида
allow read, write: if request.time < timestamp.date(2024, 5, 31);и выйдите из Test mode. Такое правило либо открывает базу всем до указанной даты, либо — если дата уже прошла — блокирует вообще все запросы.

Возврат к прежним правилам
Откатиться можно в консоли Cloud Firestore:
- Откройте консоль Firebase и выберите Firestore Database в меню слева.
- Перейдите на вкладку Rules.
- В списке слева выберите нужную прошлую версию и скопируйте её.
- Вернитесь к текущей версии и вставьте скопированный текст.
- Нажмите Publish.
Сборник готовых правил на разные случаи — Firestore Rules Recipes.
Частые вопросы
При выкатке правил — ошибка «cloud resource location is not set» или «It looks like you haven't used Cloud Firestore in this project before»
Вариант 1

Вариант 2

Скорее всего, в проекте Firebase не задано «Default GCP resource location». Что делать:
- Проверьте, что Cloud Firestore настроен.
- Перейдите по второй ссылке из текста ошибки и задайте расположение ресурсов GCP.

