Моя схема базы данных в реальном времени разработана следующим образом.
"roles" : {
"uid-1" : "user",
"uid-2" : "moderator",
"uid-3" : "user" // ... and so on
}
"photos" : {
"uid-1" : {
"photo" : "..."
"date" : "..."
}
// ... and so on
}
И мои правила безопасности определены следующим образом. Показана только соответствующая часть.
"photos" : {
"$key" : {
".read" : "auth.uid == $key || root.child('roles/'+auth.uid).val() == 'moderator'",
".write" : "auth.uid == $key"
}
}
Как видно из приведенного выше фрагмента, я хочу, чтобы пользователи могли читать или записывать свои ключи в узле photos. Что касается модераторов, я хочу, чтобы они могли читать любые данные пользователей.
Сначала кажется, что он работает, как и ожидалось, но есть небольшой улов. Согласно fire-base, если на узле не указано ни одного правила, оно будет считаться ложным. Это означает, что модератор теперь может читать данные каждого пользователя, но только если он явно запрашивает определенный UID. Другими словами, чтение photos/<uid>
разрешено, но photos/
в целом не допускается.
Потенциальным решением было переместить оператор read
, чтобы сделать его прямым потомком узла photos
. Но там я не могу применить $key
для других пользователей.
Можно попытаться разделить правило и определить в обоих местах, но это не сработает, потому что в соответствии с документами Firebase мелкие правила переопределяют более глубокие правила.