Firebase база данных в реальном времени добавить правило на основе дочернего - PullRequest
0 голосов
/ 09 апреля 2019

Я поставил правило как

(root.child('users').child(auth.uid).child('role/cafe').val() === true)

в моих правилах базы данных в реальном времени.

Мой пользователь

key {
 uid: xxxx 
 name: xxxx
 role:{
  cafe: true
  user: false
  }
}

если значение auth.uid равно ключу, правило работает, однако как я могу изменить указанное выше правило для поиска uid внутри данных

Ответы [ 2 ]

0 голосов
/ 09 апреля 2019

Неясно, какое значение $key ожидается. Поэтому я предполагаю, что это просто какая-то случайная строка, которая не используется в правилах.

Для каждого правила безопасности текущие данные узла доступны с помощью предопределенной переменной data. Правила ".write" и ".validate" также имеют доступ к записываемым данным как newData. Это оба RuleDataSnapshot объекты.

Предполагая, что пользователь, вносящий изменения, должен быть пользователем, указанным в свойстве uid, могут использоваться следующие правила.

"rules": {
  "users": {
    "$key": {
      ".read": "auth != null && data.child('uid').val() == auth.uid",
      ".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid) || (!data.exists() && newData.child('uid').val() == auth.uid)"
    }
  }
}

Приведенные выше правила используют подход fail-fast . Если пользователь не вошел в систему, проверка отменяется. В противном случае идентификатор пользователя сопоставляется с существующими данными в данном узле. Если данные еще не существуют, новые обновленные данные также должны соответствовать идентификатору текущего пользователя.

В случае, когда роль «кафе» важна, следующие правила также требуют, чтобы для «кафе» было установлено значение true, чтобы разрешить операции чтения / записи.

"rules": {
  "users": {
    "$key": {
      ".read": "auth != null && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true",
      ".write": "auth != null && ((data.exists() && data.child('uid').val() == auth.uid && data.child('role/cafe').val() == true) || (!data.exists() && newData.child('uid').val() == auth.uid && newData.child('role/cafe') == true))"
    }
  }
}

Примечание: Если $key хранит пользовательскую информацию / данные, я настоятельно рекомендую использовать идентификатор пользователя в качестве ключа, поскольку правила безопасности не могут выполнять запросы типа "имеет ли userid роль администратора?" без структурирования ваших данных, чтобы позволить это. Если $key подразумевается как имя пользователя, вместо этого используйте карту username-to-userID, поскольку это предотвратит будущие проблемы. Один из таких примеров: если пользователь хочет изменить свое имя пользователя, вы можете удалить и связать новое имя пользователя с пользователем, даже не перемещая все свои данные.

0 голосов
/ 09 апреля 2019

Вы можете использовать подстановочный знак. В твоих правилах

"users":{
  "$key":{
    ".read" : (root.child('users'+$key).child('role/cafe').val() === true) && (root.child('users'+$key).child('uid').val() === auth.uid  ),
    ".write" : (root.child('users'+$key).child('role/cafe').val() === true  ) &&(root.child('users'+$key).child('uid').val() === auth.uid  )
  }
},

Первое условие проверяет, является ли значение кафе для пользователя истинным, второе проверяет, совпадает ли uid

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