Как установить правила Firebase, которые позволяют аутентифицированным пользователям только читать и записывать свои собственные данные? - PullRequest
0 голосов
/ 05 апреля 2020

Моя структура базы данных:

users
  david@gmail.com
    records
      ApK2DFpG87NDGYutgAVO
        pulse: 80
      Bryd87NAS20dfDGYtghg
        pulse: 78
  eva@fb.com
    records
      A81hxASDKH38dhaj9321
        pulse: 93
      A82ndasklih38ASD2eda
        pulse: 67

и правила:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{email} {
      allow create, read, update, delete: if request.auth.token.email == email;
    }
  } 
}

Я бы хотел, чтобы каждый пользователь (например, foo@gmail.com) мог только читать и записывать данные под этим пользователем (users/foo@gmail.com/**).

Когда я читаю users/me@gmail.com на площадке правил (будучи аутентифицированным как me@gmail.com), я получаю «Имитация разрешена на чтение», как и ожидалось.

Однако, когда я читаю users/me@gmail.com/records из моего приложения (при аутентификации как me@gmail.com), я получаю:

FirebaseError: отсутствуют или недостаточные разрешения.

Чего мне не хватает?

Кстати, почему игровая площадка Правила не позволяет читать коллекции (например, users/me@gmail.com/records)? Там написано:

Путь должен быть на уровне документа

1 Ответ

1 голос
/ 05 апреля 2020

Вы должны воспользоваться рекурсивными подстановочными знаками версии 2 правил безопасности, как указано ниже:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{email}/{document=**} {
      allow create, read, update, delete: if request.auth.token.email == email;
    }
  } 
}

Как указано в do c, оно будет соответствовать документам в любых подколлекциях коллекции users, а также документов в коллекции users.


Кстати, почему площадка правил не позволяет читать коллекции

Если я не ошибаюсь, это потому, что правила не являются фильтрами , и поэтому вам необходимо точно указать документ, на который вы хотите настроить таргетинг, в "Правилах игры".

...