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

Я проработал отличное руководство по правилам безопасности 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'
  }
]

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

0
rafello 11 Сен 2018 в 22:20

1 ответ

Лучший ответ

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

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

2
Doug Stevenson 11 Сен 2018 в 21:46