Сбой доступа на основе ролей Firebase для новых пользователей - PullRequest
0 голосов
/ 31 августа 2018

Я следил за безопасным доступом к данным для групп пользователей на веб-сайте Firebase: https://firebase.google.com/docs/firestore/solutions/role-based-access

Теперь мои роли следующие:

service cloud.firestore {
// Roles admin = 0, owner = 1, writer = 2, reader = 3
  match /databases/{database}/documents {

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

      function isAdmin() {
            return isSignedIn() && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role == 0
      }

    match /projects/{project} {

        function getRole(rsc) {
          return rsc.data.roles[request.auth.uid];
        }

        function isOneOfRoles(rsc, array) {
          return isSignedIn() && (getRole(rsc) in array);
        }

        function canRead() {
            return isAdmin() || isOneOfRoles(resource, [1, 2, 3])
        }

        function canWrite() {
            return isAdmin() || isOneOfRoles(resource, [1, 2])
        }


      allow read: if canRead();
      allow write: if canWrite();
    }
  }
}

Теперь, когда создается новый пользователь, он не является администратором и у него нет проектов. Так что на самом деле он должен иметь возможность создать новый проект, и его список проектов должен быть пустым.

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

  getAllProjectsForUser(): Observable<Project[]> {
    return from(this.fireStore.collection('projects').snapshotChanges().pipe(map((data => {
      const projects: Project[] = [];
      data.forEach((doc) => {
        projects.push(new Project(doc.payload.doc.id, doc.payload.doc.data()['projectName'], doc.payload.doc.data()['companyName']));
      });
      return projects;
    }))));
  }

Теперь все работает, когда я администратор, но это не работает для людей, у которых нет проектов и которые не являются администратором.

Я всегда получаю Отсутствующие или недостаточные разрешения. Когда я запускаю запрос в симуляторе правил, он дает мне:

Ошибка: строка simulator.rules [16], столбец [18]. Ошибка нулевого значения. Который находится на этой линии:

return rsc.data.roles[request.auth.uid];

Понятия не имею, как мне это решить? Я попытался изменить запрос следующим образом:

  getAllProjectsForUser(uuid: string): Observable<Project[]> {
    return from(this.fireStore.collection('projects').ref.where('roles.' + uuid, '<', 4).get()).pipe(map((data => {
      const projects: Project[] = [];
      data.forEach((doc) => {
        projects.push(new Project(doc.id, doc.data()['projectName'], doc.data()['companyName']));
      });
      return projects;
    })));
  }

но это конечно создает ту же проблему, потому что нет проекта с массивом ролей.

EDIT

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

данные скриншота:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...