Правила базы данных Firebase - правила, основанные на пользовательских утверждениях - PullRequest
1 голос
/ 12 февраля 2020

У меня есть база данных Firebase в реальном времени. В настоящее время он содержит два узла admin и common

{
  "admin" : {
    "adminval" : 9898574632,
    "adminval1" : 645354536,
    "adminval2" : 7776756433
  },
  "common" : {
    "commonval" : 123433221
  }
}

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

{'roles': ['ROLE_ADMIN', 'ROLE_USER']}

Теперь я хотел бы ограничить доступ, чтобы только пользователи с утверждением ROLE_ADMIN имели право на чтение / запись admin узел и с любой из ролей могли читать / писать узел common.

Как это сделать? Я пробовал что-то вроде этого:

{
    "rules": {
       "admin": {
           ".read": "auth.token.roles.contains('ROLE_ADMIN')",
           ".write": "auth.token.roles.contains('ROLE_ADMIN')"
       }
       "common": {
           ".read": "auth.token.roles.contains('ROLE_USER') || auth.token.rules.contains('ROLE_ADMIN')",
           ".write": "auth.token.roles.contains('ROLE_USER') || auth.token.rules.contains('ROLE_ADMIN')"
       }
    }
  }

1 Ответ

0 голосов
/ 12 февраля 2020

Я никогда не использовал массивы в пользовательских утверждениях, поэтому я не уверен, как это работает, или почему это не работает для вас.

Но я заметил, что вы делаете странное сочетание Контроль доступа на основе ролей и контроль доступа на основе уровней в ваших правилах, поэтому вы хотите дать некоторые общие советы / замечания:

  • Вы отмечаете своих администраторов обеими ролями: ROLE_ADMIN и ROLE_USER.
  • Но тогда у вас есть ИЛИ в узле common, проверяющий любую роль. Это означает, что нет необходимости предоставлять администратору также ROLE_USER.
  • Имейте в виду, что пользовательские утверждения ограничены 1000 байтами и отправляются с каждым запросом. Я настоятельно рекомендую удалить префикс ROLE_, поскольку это уже подразумевается в названии заявки roles.
  • Если у вас есть универсальный лог c, который администраторы могут видеть больше, чем обычные пользователи, рассмотрите возможность использования претензии о числе c access_level. Скажем, обычный пользователь - level: 1, а администратор - level: 2. Затем вы можете проверить свои требования на минимальный уровень: ".read": "auth.token.access_level >= 1"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...