Правила безопасности Firebase для дочерних элементов в массивах

У меня есть следующая структура данных в моей базе данных:

{
    "groups" : {
        "-KEFQ7rTQscPX4hqn6ec" : {
          "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
          "description" : "Test",
          "isPublic" : true,
          "title" : "T1"
        },
        "-KEFQao_Wd-Y-nLzIx2e" : {
          "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
          "description" : "B",
          "isPublic" : false,
          "title" : "E"
        }
}

и я пытаюсь добиться следующего:

  1. Каждый может прочитать все группы с помощью "isPublic" == true
  2. Только зарегистрированные пользователи могут видеть группы, которые они создали

Мой первый подход:

{
  "rules": {
    "groups": {
      ".read": true,
      "$id": {
        ".read": "data.child('isPublic').val() === true"
        }
      }
  }
}

В этом посте рассказывается о том, почему он не работает, но я не мог понять, как я могу заставить его работать.

Изменить 1:

Этот пост имеет решение для публичной / частной проблемы (мой вопрос 1.), но не для второго вопроса.

Изменить 2:

Спасибо @VonD за рабочее решение для общественной / частной проблемы.

С этим решением проблема с публичным / частным будет решена. Учитывая, что в частной группе много членов, и их идентификаторы будут храниться в другом массиве "members" - как я могу разрешить доступ к группе только в том случае, если я являюсь членом?

"privateGroups": {
        "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
            "-KEFQao_Wd-Y-nLzIx2e" : {
                "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
                "description" : "B",
                "title" : "E",
                "members": [userId1, userId2, userId3...]
            }
        }
    }

1 ответ

Решение

Требуемые правила безопасности не могут быть реализованы с вашей структурой документа: если вы хотите выразить, что данный пользователь может читать некоторые из дочерних документов данного узла, пользователь сможет получить к ним доступ только по их полному пути, например "groups/-KEFQao_Wd-Y-nLzIx2e", но он не сможет получить список групп, соответствующих заданным критериям (если, конечно, вы не ведете по другому пути список групп, к которым пользователь может получить доступ, что означает, что вы могли бы дублировать все идентификаторы публичных групп для каждого пользователя).

Структура документа, которая бы лучше соответствовала правилам безопасности firebase, была бы:

{
    "publicGroups": {
        "-KEFQ7rTQscPX4hqn6ec" : {
            "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
            "description" : "Test",
            "title" : "T1"
        }
    },
    "privateGroups": {
        "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c": {
            "-KEFQao_Wd-Y-nLzIx2e" : {
                "createdBy" : "b5cd3a86-108e-4ef3-9ab8-8a1e4da7491c",
                "description" : "B",
                "title" : "E"
            }
        }
    }
} 

Правила безопасности тогда легко реализовать:

{
    "publicGroups": {
        ".read": true
    },
    "privateGroups": {
        "$userId": {
            ".read": "auth.uid === $userId"
        }
    }
}

Надеюсь, поможет.

Другие вопросы по тегам