Правило безопасности Firebase с возможностью чтения и записи в разных местах - PullRequest
0 голосов
/ 02 сентября 2018

Моя схема базы данных в реальном времени разработана следующим образом.

"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 мелкие правила переопределяют более глубокие правила.

1 Ответ

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

У вас, кажется, есть два требования:

  1. Каждый пользователь может читать и писать свои фотографии.
  2. Модератор может читать фотографии всех пользователей.

Это может быть применено в правилах безопасности на стороне сервера, таких как:

"photos" : {
    ".read" : "root.child('roles/'+auth.uid).val() == 'moderator'",
    "$key" : {
        ".read" : "auth.uid == $key",
        ".write" : "auth.uid == $key"
    }
}

Разрешение, которое модератор получает от /photos, переносится на фотографии каждого пользователя. Это разрешение не может быть отозвано на более низком уровне. Но вы определенно можете дать пользователям * дополнительное ** разрешение на более низком уровне, что и делают эти правила.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...