Можно ли получить доступ к значениям свойств документа, содержащимся в массивах объектов?
Я проработал отличное руководство по правилам безопасности 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 ответ
Я думаю, что то, как вы структурировали свои роли, работает против желаемого результата. Вы действительно хотите, чтобы ваше поле roles
в пользовательском документе было проиндексировано ключевыми именами всех ролей, которые может иметь пользователь, более похоже на первый пример, который вы показали, что упрощает поиск, если у пользователя есть роль.
В том виде, в каком это есть сейчас, правило должно иметь возможность 1) перебирать все роли, затем 2) проверять, имеет ли каждый повторяемый объект значение поля для role
, которое соответствует тому, что вы хотите. Правила безопасности недостаточно гибкие, чтобы выразить эту логику.
Похожие вопросы
Новые вопросы
firebase
Firebase - это бессерверная платформа для унифицированной разработки приложений для мобильных устройств и для Интернета. Он использует структуру NoSQL в отличие от СУБД.