@MarcelBochtler У вас есть ссылка на документацию о том, что «точки не разрешены в качестве ключа карты»?

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

Я структурировал свои данные таким образомэтот блог). Также эта структура может быть изменена при необходимости.

list
  list_1:
    users:
      owner:
        [email protected]: true
      shared:
        [email protected]: true
        [email protected]: true
    id
    name
    items:
      item_1:
        id:
        name:
      ...

Чего я пытаюсь добиться: каждый должен иметь возможность создавать списки. Затем их создатель становится владельцем созданного списка. Только владелец и пользователи в «общем» документе должны иметь возможность читать и писать в этот список.

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

service cloud.firestore {
  match /databases/{database}/documents {
    match /lists/{listId}/{anything=**} {
        allow read, write: if !exists(resource.data.users.owner) ||
                               resource.data.users.owner == request.auth.token.email ||
                           ,    request.auth.token.email in resource.data.users.shared
    }
  }
}

Ответы на вопрос(1)

Я изменил структуру данных на это:

list
  list_1
    owner: [email protected]
    writeAccess: [[email protected], [email protected]]
    id
    name
    items:
      item_1:
        id:
        name:
      ...

Тогда правила базы данных работают так:

service cloud.firestore {
  match /databases/{database}/documents {
    match /lists/{listId} {
        // Allow RW on lists for owner, shared user or for everyone if it's a new list
      allow read, write: if resource.data.owner == request.auth.token.email ||
                            request.auth.token.email in resource.data.writeAccess ||
                            !exists(/databases/$(database)/documents/lists/$(listId))
    }
    match /lists/{listId}/items/{itemId} {
        // Allow RW on item for owner or shared user of parent list
        allow read, write: if get(/databases/$(database)/documents/lists/$(listId)).data.owner == request.auth.token.email ||
                              request.auth.token.email in get(/databases/$(database)/documents/lists/$(listId)).data.writeAccess ||
                             !exists(/databases/$(database)/documents/lists/$(listId)) // Needed for new lists. Because lists and items are created in a batch
    }
  }
}
 The Oddler05 нояб. 2017 г., 18:28
Спасибо за ответ! Так что это объясняет, почему это не работает. Я использовал UID на карте, но все еще нет торта. Спасибо за ссылку! Сейчас я жестко закодирую своих разрешенных тестеров и буду следить за обновлениями.
 Marcel Bochtler05 нояб. 2017 г., 12:40
@TheOddler Вы правы, запросить все списки одного пользователя с этим решением невозможно. Чтобы сделать это возможным, вы можете сохранить идентификатор пользователя в качестве ключа карты. Это также предложение в размещенной вами ссылке. К сожалению, точки не допускаются в качестве ключа карты. Так что адреса электронной почты не будут работать. Также существует известная проблема с разрешениями на основе карт. Видеть:stackoverflow.com/q/46674372/2837489
 The Oddler05 нояб. 2017 г., 09:01
Если вы используете список доступа для записи, подобный этому, для совместного использования, как тогда вы будете запрашивать все списки для одного пользователя? Здесь говорят, что невозможно получить все сообщения с категориями кошек, если вы используете массив:firebase.google.com/docs/firestore/solutions/arrays, Как ты это решил?
 ralphinator8013 мар. 2018 г., 18:18
@MarcelBochtler У вас есть ссылка на документацию о том, что «точки не разрешены в качестве ключа карты»?

Ваш ответ на вопрос