Правила базы данных Firebase, разрешают удаление, только если свойство документа равно идентифицированному идентификатору пользователя - PullRequest
1 голос
/ 25 апреля 2019

У меня проблемы с добавлением правил безопасности в мою базу данных firebase. Я хочу разрешить удаление голосов, только если аутентифицированный пользователь равен свойству uid в документе для голосования. Все работает отлично, КРОМЕ для правила удаления, которое я создал в match /votes/ndomvoteId‹.

Я пытался сделать это с resource.data.uid, но симулятор жалуется, и я получаю сообщение об ошибке «Ошибка выполнения симуляции - Ошибка: simulator.rules Ошибка нулевого значения»

service cloud.firestore {
  match /databases/{database}/documents {

    match /polls/{pollId} {
      allow read;
      allow delete: if getUserData().roles.keys().hasAny(['admin']);
      allow create: if isSignedIn();
    }

    match /users/{userId} {
        allow read, write: if isOwner(userId);
    }

    match /votes/{voteId} {
        allow read;
      allow create: if isSignedIn();
      allow delete: if request.auth.uid == resource.data.uid;
    }
  }

  /// Functions ///
  function isSignedIn() {
    return request.auth != null
  }

  function isOwner(userId) {
    return request.auth.uid == userId
  }

}

Обновление

Я также пытался использовать подстановочный знак / {document = **}, и он выдал мне ту же ошибку нулевого значения

match /votes/{document=**} {
        allow read;
      allow create: if isSignedIn();
      allow delete: if request.auth.uid == resource.data.uid;
    }

Я также пытался использовать функцию get (), но получил сообщение об ошибке «Функция не найдена: Имя: [get]

»
match /votes/{voteId} {
  allow read;
  allow create: if isSignedIn();
  allow delete: if get(/databases/$(database)/documents/votes/$(voteId)).data.uid == request.auth.uid
}

1 Ответ

1 голос
/ 25 апреля 2019

Вы создали документ с полем с именем uid? Как это.

firebase.firestore().collections("votes").add({uid: firebase.auth().currentUser.uid});

resource - это документ пожарного магазина.

resource.data - карта данных документа.

Симулятор на консоли Firebase использует реальные данные из хранилища, которые существуют в вашем проекте.

И я думаю, что лучше поменять правила на следующие.

...
    match /votes/{voteId} {
        allow read;
      allow create: if isSignedIn() && request.auth.uid == request.resource.data.uid;
      allow delete: if isSignedIn() && request.auth.uid == resource.data.uid;
    }
...

  function isSignedIn() {
    return request.auth.uid != null
  }
...

См:

...