Как изменить снимок главного потомка, чтобы не создавать проблем с правилами безопасности? - PullRequest
0 голосов
/ 06 августа 2020
A = Database.database().reference().child("users");
A.observe(DataEventType.value, with: {snapshot in

Правила:

"rules": {
    "users" :
        ".read": "auth.uid != null",
         ".write": "auth.uid != null"  {
             "$uid":  {
                    "Garden" :{
                        ".read": "auth.uid != null"
                         ,".write": "$uid == auth.uid"
 }
                     "Hose": .....
                     "House": ....

Итак, как вы увидите, пользователям не назначается правило, потому что оно отменяет правила для Garden, House, Hose и т. Д. c. Поэтому я хочу изменить код, который ищет снимок в A, на go более непосредственно для дочерних элементов пользователей, а не останавливаться на пользователях и, следовательно, не проходить тест безопасности (поскольку у пользователей нет правил).

Что следует за A.observe:

   for users in snapshot.children.allObjects as! [DataSnapshot] {
let usersObject = users.value as? [String: AnyObject]
let usersGarden = usersObject?["Garden"] as? String
let usersHose = usersObject?["Hose"] as? String
let usersHouse = usersObject?["House"]  as? String
......

let USA = UserH(Garder: usersGarden, Hose: usersHose...)
 self.users.append.

self.table.reloadData()

Вы увидите, что целями являются дочерние элементы, которые идут после uid, поэтому способ нацеливания на них мог бы позволить мне избежать остановки на пользователях в моментальном снимке А

1 Ответ

0 голосов
/ 09 августа 2020

Как есть, код и правила в вопросе совпадают, код считывает узел пользователей, и правила позволяют любому аутентифицированному пользователю читать этот узел и перебирать дочерние данные.

Я считаю, что ваш настоящий вопрос is

Как мне получить более детальный контроль над тем, что может быть записано на дочерний узел в Firebase, используя правила Firebase

предположим, что у нас есть структура, которая соответствует вашим правилам

users
   uid_0
      garden: "rose"
      hose: "green"
   uid_1
      garden: "tomato"
      hose: "black"

и предположим, что мы хотим разрешить пользователю только обновлять свой собственный сад; другие пользователи не могут изменять этот пользовательский сад. например, uid_0 может изменять только узел /users/uid_0/garden. uid_1 может изменять только /users/uid_1/garden et c.

Вот правило, которое позволяет всем аутентифицированным пользователям читать узел пользователей, но только текущий аутентифицированный пользователь может писать в свой собственный садовый узел

{
  "rules": {
    ".read": false,
      ".write": false,
        "users" : {
          ".read": "auth != null",
            "$uid": {
              "garden": {
                ".write": "$uid === auth.uid" //only the authenticated user can write
              }
          }
        }
  }
}

Обратите внимание, что я установил для чтения и записи значение false на высоком уровне и предоставляю доступ на более низком, более детальном уровне.

Итак, в этом случае, если был другой узел на том же уровне, что и 'users 'никто не мог читать или писать на нем.

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