Cloud Firestore Security Rules - доступ к свойствам в массивах объектов - PullRequest
0 голосов
/ 11 сентября 2018

Можно ли получить доступ к значениям свойств документа, содержащимся в массивах объектов?

Я работал над превосходным Angular Firebase руководством по правилам безопасности - в котором ключи документов используются для удовлетворения требований доступа. Вот пример:

Простой пользовательский документ

name: 'a user',
roles: {
  admin: true,
  editor: true
}

Правило безопасности

service cloud.firestore {
  match /databases/{database}/documents {
      function getUserData() {
        return get(/databases/$(database)/documents/accounts/$(request.auth.uid)).data
      }
      function userHasRole(role) {
        return getUserData().roles[role] == true;
      }
      match /<some_path>/ {
        allow read, write: if userHasRole(editor);

    }
  }
}

Моя структура документа пользователя немного сложнее, хотя в приложении есть разные модули, каждый со своими ролями. Например:

Сложный пользовательский документ

name: 'a user',
roles:[
  {
    feature: 'feature 1',
    role: 'admin'
  },
  {
    feature: 'feature 2',
    role: 'editor'
  }
]

С моим пользовательским документом, структурированным таким образом, возможно ли получить доступ к значению «роль» данной функции в рамках правил безопасности?

1 Ответ

0 голосов
/ 12 сентября 2018

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

В том виде, в каком вы сейчас его используете, правило должно быть в состоянии 1) повторять все роли, затем 2) проверять, есть ли у каждого повторяемого объекта значение поля для role, совпадающее с вашимхочу.Правила безопасности недостаточно гибки, чтобы выразить эту логику.

...