Правила безопасности Firestore с функциями возвращают неизвестную ошибку - PullRequest
0 голосов
/ 14 апреля 2019

У меня есть коллекция пользователей:

users:
   userUid:
       group: "group_1"
       name: "Paul"
   userUid:
       group: "group_1"
       name: "Gregor"
   userUid:
       group: "group_2"
       name: "Mary"

и коллекция ShoppingLists:

shoppingList:
   listUid:
        isActive: true,
        group: "group_1",
        name: "list_ONE"
   listUid:
        isActive: false,
        group: "group_1",
        name: "list_TWO"
   listUid:
        isActive: true,
        group: "group_2",
        name: "list_THREE"

Я хотел бы ограничить доступ к чтению / обновлению, чтобы только люди, принадлежащие к определенной группе, могли редактировать / читать документы в той же группе.

Я пытался с помощью следующего правила, просматривая документы , но в симуляторе консоли Firabase я получаю "неизвестную ошибку" и не получаю никакой подсказки консоли об этом:

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

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

    function getGroup(usr) {
      return usr.data.group;
    }

    function isInGroup(usr, groupName) {
       return signedIn() && (getGroup(usr) == groupName);
    }


    match /users/{user} {
      // Read access needed to get the user group
        allow read: if signedIn();  
    }


    match /shoppingLists/{shoppingList} {
      // Everybody can create a new list
      allow create: if signedIn();

      // Only people from the list group can read/update that list
      allow read: if isInGroup(get(/databases/$(database)/documents/users/$(request.auth.uid)), resource.data.group);

      allow update: if isInGroup(get(/databases/$(database)/documents/users/$(request.auth.uid)), request.resource.data.group)
                       && request.resource.data.isActive;
    }
  }
}

1 Ответ

0 голосов
/ 14 апреля 2019

Вы неправильно используете get () в своих правилах. Вы передаете строковый путь к документу, который включает в себя коллекции и документы, но get () требует, чтобы вы передали объект пути, который 1) не является строкой и 2) имеет префикс /databases/$(database)/documents. Вы должны прочитать документацию о доступе к другим документам , чтобы увидеть некоторые примеры, такие как этот:

service cloud.firestore {
  match /databases/{database}/documents {
    match /cities/{city} {
      // Make sure a 'users' document exists for the requesting user before
      // allowing any writes to the 'cities' collection
      allow create: if exists(/databases/$(database)/documents/users/$(request.auth.uid))

      // Allow the user to delete cities if their user document has the
      // 'admin' field set to 'true'
      allow delete: if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.admin == true
    }
  }
}
...