Правила:

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

Поток приложения:

Создайте пользователя с Firebase Auth (получите UID)Создать пользовательский документ в базе данных, используя UID в качестве ключа

Код клиента (операция создания):

this.db.doc('users/' + uid).set({username: Santa})

Правила пожарного депо:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow create: if 
        request.auth != null && 
        request.auth.uid == uid && 
        !exists(/databases/$(database)/documents/users/$(uid));
      allow update: if request.auth != null && request.auth.uid == uid; 
    }
  }
} 

Дополнительная информация:

Как вы уже знаете, код не работает. Каждый раз, когда я запускаю код на стороне клиента, текущий пользователь полностью заменяется новым документом. Однако, если я удаляю следующую строку из правил, все работает как положено:

allow update: if request.auth != null && request.auth.uid == uid;

Но теперь возникает вопрос, как защитить данные в пользовательском документе от несанкционированных изменений? Любой совет?

 DauleDK26 окт. 2017 г., 11:09
Я хотел бы рассмотреть возможность использования функций Firebase вместо клиента, модифицирующего коллекцию пользователей. Существует триггер «auth», который позволяет вам делать Stuf при создании нового пользователя.

Ответы на вопрос(3)

Решение Вопроса

только если он еще не существует, просто используйтеallow create Правило, которое у вас уже есть. Потому что у вас также естьallow update Правило, обновление существующих данных также допускается.

Следующие правила должны быть достаточными:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{uid} {
      allow create: if request.auth != null && request.auth.uid == uid;
    }
  }
} 

Вам не нужноexists() позвони, потому чтоallow create применяется только в том случае, если данные не существуют.

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

Вот некоторые примеры:https://firebase.google.com/docs/firestore/security/rules-conditions#authentication

 Jessycormier01 дек. 2018 г., 15:36
Предоставленная ссылка недействительна, попробуйте эту:firebase.google.com/docs/reference/security/storage

но не в правилах. Добавьте addOnCompleteListener в коллекцию пользователей и после получения результата выполните некоторые действия.

getUsers.document(userUID).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> doc) {
     if(!doc.getResult().exists()){
        //add new user
    }
}                       

}

Правила:

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

users /' + uid) .set ({username: Santa}, {merge: true}) Должен объединяться, а не заменяться. Пропущенные поля останутся нетронутыми.https: //f,irebase.google.com/docs/reference/js/firebase.firestore.DocumentReference#set

Ваш ответ на вопрос