Правила Firebase - значение только для чтения, которое было в запросе - PullRequest
0 голосов
/ 10 ноября 2019

Я храню имена пользователей отдельно в разделе проверки в БД. Существуют только имена пользователей, поэтому, когда пользователь регистрируется, он может ввести имя пользователя и посмотреть, доступно ли имя пользователя до его регистрации. Правила для этого теперь ".read": true, так что в основном каждый может получить легкий доступ ко всем именам пользователей в БД. Я хотел бы предотвратить это, но я не уверен, как это сделать, поскольку я не могу использовать правило auth! = Null, поскольку пользователь еще не создан.

Моя единственная идея состояла в том, чтобы разрешить чтение только имени пользователякоторый запрашивается, то есть что-то

 firebase.database().ref('Validations/Usernames')
            .orderByChild('name')
            .equalTo(username)
            .once('value')
            .then(snapshot => ....

, а затем с использованием правила, подобного этому:

"$name": {
   ".read": "query.equalTo == $name"
}

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

Есть ли какой-либо аналогичный способ разрешить чтение только значения, которое было запрошено для чтения с клиента? Или, может быть, есть какой-то совершенно другой способ, которым я должен подойти к проверке имени пользователя, прежде чем он создаст учетную запись?

1 Ответ

1 голос
/ 10 ноября 2019

Если вы хотите, чтобы пользователь мог только проверить, является ли введенное им имя пользователя уже заявленным, он не имеет доступа для чтения ко всему узлу Validations/Usernames. Вместо этого им нужен только доступ для чтения к определенному дочернему элементу.

Чтобы разрешить это, убедитесь, что вы используете имена пользователей в качестве ключей в Validations/Usernames, что-то вроде:

"Validations": {
  "Usernames": {
    "CosmicSeizure": "uidOfCosmicSeizure",
    "puf": "uidOfPuf"
  }
}

С вышеизложенным ваши правила могут быть:

"Validations": {
  "Usernames": {
    "$name": {
      ".read": true
    }
  }
}

И затем вы можете проверить, существует ли имя пользователя с:

firebase.database().ref('Validations/Usernames')
        .child(username)
        .once('value')
        .then(snapshot => ....

И затем вы проверите, если snapshot.exists().

...