Правила безопасности Firebase проверяют несколько ссылок - PullRequest
0 голосов
/ 03 июня 2019

Я занимаюсь разработкой приложения, в котором мне нужно, чтобы набор пользователей (сотрудников), принадлежащих к группе (магазину), мог читать только из таблицы «Клиенты», если у этих клиентов есть заказ, размещенный сотрудником в тот же магазин. Пока это моя структура (верхний уровень - коллекции):

Users: [
 {id: 1, name: "John", store: "a"},
 {id: 2, name: "Jane", store: "a"},
 {id: 3, name: "Charles", store: "b"},
],
Stores: [
 {id: "a", name: "Store A"},
 {id: "b", name: "Store B"},
],
Customers: [
 {id: "1", name: "Customer 1", ...data},
 {id: "2", name: "Customer 2", ...data}
],
Orders: [
 {id: "001", customer: "/Customers/1", employee: "/Users/1"},
 {id: "002", customer: "/Customers/2", employee: "/Users/3"}
]

В этом примере Джон и Джейн должны видеть Клиента 1 , но не Клиента 2, а Чарльз должен иметь возможность видеть Клиента 2 , но не Клиента 1.

Я пытался создать функцию для этого, например:

function canSeeCustomers() {
    if get(/databases/$(database)/documents/users/$(request.auth.uid)).data.store == ?
}

Но я не знаю, как проверить поле store в коллекции Orders .

Есть ли способ сделать это? Или мне лучше провести рефакторинг структуры БД, чтобы Users был вложенным документом Stores ?

1 Ответ

0 голосов
/ 03 июня 2019

Добавьте магазины к своим данным клиентов тоже. stores: {a: true}. Так что вы могли бы сделать

allow read: if resource.data.stores[get(/databases/$(database)/documents/users/$(request.auth.uid)).data.store];
...