Ограничение доступа пользователей на чтение / запись к узлам Firebase не работает - PullRequest
0 голосов
/ 23 января 2019

У меня есть структура базы данных Firebase с несколькими корневыми узлами (для этого вопроса важны только несколько): Buildings и BuildingUserId (намерение BuildingUserUid заключается в контроле доступа пользователей к их зданиям и только к их зданиям.)

Если мы немного углубимся в структуру обоих узлов, мы получим следующее:

users
  `-- userID // one user can access this 
  |   `-- isAdmin
  |       `-- building pushkey
  |       `-- another building pushkey etc.
  `-- another userID // one user can access this 
  |   `-- isAdmin
  |       `-- building pushkey
  |       `-- another building pushkey etc.
  `-- another user UID etc.


buildingsUserUid
  `-- firebase user UID // one user can access this 
  |   `-- building pushkey
  |   `-- another building pushkey
  `-- another firebase user UID // another user can access this 
      `-- yet another building pushkey 
      `-- and another building pushkey etc.

buildings
 `-- building pushkeys // user with right UID can access this
 |   |-- firebase user UID
 |   `-- Other data
 `-- building pushkeys  //another user with right UID can access this
     |-- firebase user UID
     `-- Other data

Тогда мои правила для firebase выглядят так:

{
  "rules": {
      "users": {
          "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth != null && $uid === auth.uid",
          }
      },
      "buildings": {
         ".read": "root.child('buildingsUserUid').hasChild(auth.uid)",
         ".write": "!data.exists() || root.child('buildingsUserUid').hasChild(auth.uid)",
            "$pushkey": {
                ".read": "root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
                ".write": "!data.exists() || root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
             }
      },
      "buildingsUserUid": {
         "$user": {
             ".read": "auth != null && auth.uid === $user",
             ".write": "auth != null && auth.uid === $user"
          }
      },
 }

С помощью приведенных выше правил я надеялся ограничить доступ к узлам здания только тем пользователем, у которого был ключ здания на узле buildingUserUid.Однако, если я console.log (this) в моем приложении vue.js, я смогу увидеть все здания.

enter image description here

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

ОБНОВЛЕНИЕ:

После ответа @Umar я изменил свои правила на:

{
  "rules": {
      "users": {
          "$uid": {
            ".read": "auth.uid == $uid",
            ".write": "auth != null && $uid === auth.uid",
          }
      },
      "buildings": {
         ".read": "root.child('buildingsUserUid').hasChild(auth.uid)",
         ".write": "!data.exists() || root.child('buildingsUserUid').hasChild(auth.uid)",
            "$pushkey": {
                // changed the following 'read' rule line
                ".read": "root.child('buildingsUserUid').child($pushkey).child('userId') === auth.uid"
                ".write": "!data.exists() || root.child('buildingsUserUid').child(auth.uid).hasChild($pushkey)",
             }
      },
      "buildingsUserUid": {
         "$user": {
             ".read": "auth != null && auth.uid === $user",
             ".write": "auth != null && auth.uid === $user"
          }
      },
 }

Но это вызывает ошибку:

Ошибка сохранения правил - Строка 15: Неверное выражение ==: левый операнд не является числом, логическое значение, строка, ноль.-

Есть мысли?

1 Ответ

0 голосов
/ 23 января 2019

Ставя ".read": "root.child('buildingsUserUid').hasChild(auth.uid)" в buildings, вы, по сути, разрешаете любому пользователю любого здания читать все данные узлов здания.

Вы должны разрешить доступ на чтение на один уровень ниже, то есть в pushkey.Также, если вы связываете только одного пользователя с одним зданием, вы можете просто сохранить идентификатор здания под пользовательским узлом, а не под кнопкой построения.

для вашей текущей структуры pushkey чтение может быть

".read": "root.child('buildingsUserUid').child($pushkey).child('userId') === auth.uid"

Я предполагаю, что у вас есть один пользователь на здание, и uid пользователя хранится с ключом userId в «ключе»

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