Сложные правила безопасности Firebase - PullRequest
1 голос
/ 06 июня 2019

У меня есть таблица в базе данных firebase, которая называется «Обсуждения», и она показывает некоторые сообщения, созданные пользователями.

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

Пример узла выглядит следующим образом:

"Discussions" : {
"36" : {
  "-Ldjrrzfo5K94KT2tjBM" : {
    "content" : "text",
    "from" : "lOkhKOJBNEZuvXt2Zgzz5tUr4ft2",
    "time" : 1556655079442
  }

Для этого я попробовал следующее правило:

"Discussions" : {
  "$lan_id": {
".write": "auth != null",
      "$node_id" : {
        ".read": "root.child('Users').child(root.child('Discussions').child($lan_id).child($node_id).child('from').val()).child('deleted').val() != true",
        ".validate": "newData.child('time').isNumber() && newData.child('from').isString() && newData.child('content').isString()"
    }
  }
}

Это примерудаленный пользователь:

"Users" : {
"lOkhKOJBNEZuvXt2Zgzz5tUr4ft2" : {
  "aboutme" : "AAADEFAULT",
  "birthdate" : "01.01.1970",
  "city" : "Deleted",
  "deleted" : true,
  "image" : "default",
  "name" : "Deleted Account",
  "online" : 0,
  "register_date" : 0,
  "sex" : 1,
  "thumb_image" : "default",
  "whyhere" : "AAADEFAULT"
}

Но это не сработает, потому что, если я добавлю правило «чтения» в «$ node_id», оно не будет показывать никаких записей, даже если я установлю прямо так:

"$node_id" : {
    ".read": true
 }

Но мне также нужно получить доступ к "$ node_id", чтобы сделать то, что я хочу сделать.

Есть ли способ создать такое правило?

1 Ответ

0 голосов
/ 06 июня 2019

Там есть некоторые синтаксические ошибки.

  1. Чтобы передать значение $lan_id в child(), оно должно , а не быть в кавычках.Если вы напишите child('$lan_id'), то '$lan_id' это просто строка.Чтобы передать значение захваченного сегмента $lan_id в путь, вам понадобится child($lan_id).
  2. Часть while child(root.child('Discussions')... выглядит странно.Я не могу сказать, если это правильно, поскольку JSON, который вы показали, не содержит свойства deleted, которое проверяют ваши правила, но выглядит необычно.

Я бы ожидал чего-то более близкогона это:

"root.child('Users').child('Discussions').child($lan_id).child($node_id).child('from').child('deleted').val() !== true"

Обратите внимание, что вы также можете использовать parent() для обхода дерева, поэтому что-то подобное может также сработать:

"data.parent().child('from/deleted').val() !== true"

Если у вас есть это правило в$node_id уровень ваших правил, тогда вызов parent() приведет вас к $lan_id

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