Правила безопасности Firestore, get () и операция allow create - PullRequest
0 голосов
/ 27 июня 2018

Я создал приложение, в котором пользователи могут публиковать записи в базе данных firestore. Сейчас я нахожусь в точке, где я внедряю правила безопасности, но я изо всех сил пытаюсь найти решение.

Мой код выглядит так

docRef.get().then(function(doc){
            if(doc.exists){
                docRef.set(//data to set here)
            } else {
                docRef.update(//data to update here)
            }
            .catch((error) => {
              alert('Error' + error);
            })
 

Мои правила в настоящее время установлены, чтобы позволить пользователю создавать объект, если они авторизованы, и разрешают обновление, только если идентификатор пользователя в записи совпадает.

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{user}{
    	allow create: if request.auth.uid != null;
			allow read, write: if request.auth.uid == resource.id;    
    }
    match /equipment/{document} {
    	allow create: if request.auth.uid != null;
      allow read, update: if request.auth.uid == resource.data.user;
    }

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

Спасибо

1 Ответ

0 голосов
/ 08 августа 2018

Я все еще работаю над своими правилами, но надеюсь, что это поможет.

Если вы пытаетесь убедиться, что пользователь редактирует что-то свое, и его uid совпадает с document id ....

function isOwner(userId) {
  return request.auth.uid == userId
}
match /users/{userId} { //this is the document 
    allow write: if isOwner(userId);
}

Если вы пытаетесь убедиться, что они являются создателями документа:

match /equipment/{documentId} {
   allow create: if request.auth.uid != null;
   allow read, update: if get(/databases/$(database)/documents/equipment/documentId).data.userId == request.auth.uid;
}

https://firebase.google.com/docs/firestore/security/rules-conditions?authuser=0

Вам нужно использовать функцию get для извлечения интересующего вас документа. Эта функция возвращает данные, имеющие связанные поля, с которыми вы можете сравнивать, в данном случае с любым именем поля, в котором вы сохранили идентификатор пользователя, чтобы вы могли сравните это с их auth.uid.

...