Android (Java) | Правила безопасности Firestore: разрешить доступ только к путям, содержащим электронную почту пользователя - PullRequest
0 голосов
/ 14 апреля 2020

Мне нужно настроить правила Firestore, чтобы этот код вставлял данные только в том случае, если каталог в коллекции «users» равен электронной почте пользователя:

FirebaseAuth mAuth = FirebaseAuth.getInstance();
String email = mAuth.getCurrentUser().getEmail()
FirebaseFirestore db = FirebaseFirestore.getInstance();
db.collection("users").document(email).set("Important data");

Теперь у меня есть следующие правила, которые позволяют любые чтения и записи везде (если пользователь авторизован):

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if request.auth.uid != null;
    }
  }
}

Как вы можете видеть, мой Firestore имеет следующую структуру:

Firestore-root
    |
    --- users (collections)
    |     |
    |     --- email: mymail@google.com(document)
    |            | 
    |            --- Data
    |     --- email: othermail@google.com(document)
    |            | 
    |            --- Data2
    ...
    --- messages (collections)
    |     |
    |     --- email: mymail@google.com(document)
    |            | 
    |            --- message
    |     --- email: othermail@google.com(document)
    |            | 
    |            --- message2

Как мы можем запретить доступ, если пользователь "mymail@google.com "пытается прочитать данные" othermail@google.com "?

1 Ответ

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

Прежде всего, намного чище , если документы идентифицируются по UID пользователя, а не по его электронной почте. Если вы можете внести изменения, все станет проще, и у вас будет меньше проблем в будущем. Вы можете просто использовать request.auth.uid для сравнения с каждым идентификатором документа.

Если вы действительно не можете использовать UID и должны использовать электронную почту (что не очень хорошо), вы можете использовать request.auth .token.email (обратите внимание, что ссылка do c предполагает, что адрес электронной почты может отсутствовать для пользователя, и в этом случае вам не повезло с этим пользователем).

Вы должны вызывать каждый документ по имени:

    match /messages/{id} {
      allow read, write: if request.auth.token.email == id;
    }
    match /users/{id} {
      allow read, write: if request.auth.token.email == id;
    }
...