Правила безопасности Firestore с функциями возвращают неизвестную ошибку

#firebase #google-cloud-firestore #firebase-security

#firebase #google-облако-firestore #firebase-безопасность

Вопрос:

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

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

и коллекция списков покупок:

 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() amp;amp; (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)
                       amp;amp; request.resource.data.isActive;
    }
  }
}
  

Комментарии:

1. К вашему сведению, если вы хотите отформатировать код в вопросе, вы можете выбрать весь код и использовать кнопку {} в редакторе для форматирования всего.

Ответ №1:

Вы неправильно используете get() в своих правилах. Вы передаете строковый путь к документу, который включает коллекции и документы, но get() требует, чтобы вы передали объект path, который 1) не является строкой, и 2) имеет префикс with /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
    }
  }
}