Невозможно получить данные клиента для отображения [firestore] - PullRequest
0 голосов
/ 04 марта 2019

Моя база данных настроена как / clients и использует firebase auth для обработки пользователей.Я хочу сделать так, чтобы пользователи могли только просматривать, редактировать и удалять клиентские данные, которые они создали.Текущее правило безопасности пожарного депо

[code]service cloud.firestore {
  match /databases/{database}/documents {
    // Make sure the uid of the requesting user matches name of the user
    // document. The wildcard expression {userId} makes the userId variable
    // available in rules.
    match /clients/{userId} {
      allow read, update, delete: if request.auth.uid == userId;
      allow create: if request.auth.uid != null;
    }
  }
}[/code]

С этим правилом пользователи могут добавлять новых клиентов в базу данных, однако клиенты на веб-сайте не отображаются.У меня есть настройки кода, так что когда пользователь добавляет клиента, он присоединяет UID пользователей к клиенту в «userId».Код для отображения клиентов:

[code]<tbody>
                    {clients.map(client => (
                        <tr key={client.id}>
                            <td>{client.firstName} {client.lastName}</td>
                            <td>{client.dateCreated}</td>
                            <td><a href={`tel:${client.phone}`}>{client.phone}</a></td>
                            <td>
                                <Link to={`/client/${client.id}`} className="btn btn-secondary btn-sm">
                                    <i className="fas fa-arrow-circle-right"></i> Details
                                </Link>
                            </td>
                        </tr>
                    ))}
                 </tbody>

[/ code]

Я не уверен, что я делаю неправильно, это правила безопасности или как я выбираюотобразить данные?

Ответы [ 2 ]

0 голосов
/ 05 марта 2019

Я смог получить свой результат, но не по правилам безопасности.После настройки правил безопасности и переменных моей базы данных таким образом, чтобы идентификатор пользователя был присоединен к добавляемым данным, я попытался применить правило, предложенное @firebaser.Я смог создать клиентов по этому правилу, как упоминалось выше, однако я не смог их просмотреть, и в консоли я получил сообщение «Ошибка с прослушивателем профиля: отсутствуют или недостаточно разрешений. FirebaseError: Отсутствует или недостаточно разрешений».

Судя по ошибке, мне пришлось редактировать один из файлов firebase в модуле узла папки моего проекта.Я не хотел рисковать изменением этих файлов, поэтому вместо использования правил безопасности для фильтрации данных я просто изменил способ отображения данных клиента.Я добавил .filter перед функцией .map, чтобы она отображала только клиентов, связанных с идентификатором пользователя.Хотя мои правила безопасности позволяют только зарегистрированным пользователям читать и записывать данные.[code]

<tbody>
            {clients.filter(client => client.userId === firebase.auth().currentUser.uid).map(client => (
                <tr key={client.id}>
                    <td>{client.firstName} {client.lastName}</td>
                    <td>{client.dateCreated}</td>
                    <td><a href={`tel:${client.phone}`}>{client.phone}</a></td>
                    <td>
                        <Link to={`/client/${client.id}`} className="btn btn-secondary btn-sm">
                            <i className="fas fa-arrow-circle-right"></i> Details
                        </Link>
                    </td>
                </tr>
            ))}
         </tbody>

[/ code]

Я не могу никому сказать, насколько безопасен этот метод, но он работает.

0 голосов
/ 04 марта 2019

Я понимаю, что у вас есть коллекция клиентов и коллекция пользователей.Пользователи могут создавать клиентов и могут только видеть / редактировать / удалять клиентов, которых они создали, верно?Если это так, просто добавьте поле createBy (может быть любым), которое содержит пользовательский uid, который создал конкретного клиента, и проверьте, равно ли это поле uid, полученному из объекта auth:

service cloud.firestore {
  match /databases/{database}/documents {
    match /clients/{clientId} {
      // only user who created the client can read/update/delete it
      allow read, update, delete: if resource.data.createdBy == request.auth.uid;
      // logged user only can create a client
      allow create: if request.auth.uid != null;
    }
  }
}

Подстановочный знак {clientId} здесь только для того, чтобы сказать «эй, это правило применимо для любого документа в группе клиентов / коллекции».Вы можете получить данные, хранящиеся в документе, благодаря объекту resource.data .

Все перечисленное в документации: https://firebase.google.com/docs/firestore/security/get-started

...