Неясно, какое значение $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, поскольку это предотвратит будущие проблемы. Один из таких примеров: если пользователь хочет изменить свое имя пользователя, вы можете удалить и связать новое имя пользователя с пользователем, даже не перемещая все свои данные.