Как ограничить доступ на запись для пользователей, которые объявлены под определенным узлом в базе данных реального времени - PullRequest
0 голосов
/ 26 мая 2018

Я заметил что-то странное в своем приложении.Прежде всего, я регистрируюсь.

enter image description here

И затем захожу на экран приветствия.

enter image description here

И чтобы убедиться, что я действительно зарегистрирован в firebase, я иду в консоль.Сначала в Аутентификации

enter image description here

А затем в Базе данных, где вы видите узел с именем Users (я объявил как Users, когда я регистрировался).

enter image description here

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

E/CommentActivity: User AhtNY3bm7aQdPiJewf3PBN310732 is unexpectedly null

И это идет отсюда.

User user = dataSnapshot.getValue(User.class);

                    // [START_EXCLUDE]
                    if (user == null) {
                        // User is null, error out
                        Log.e(TAG, "User " + userId + " is unexpectedly null");
                        Toast.makeText(CommentActivity.this,
                                "Error: could not fetch user.",
                                Toast.LENGTH_SHORT).show();
                    }

Весь код CommentActivity здесь здесь .

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

public class User {

public String username;
public String email;


public User() {
    // Default constructor required for calls to DataSnapshot.getValue(User.class)
}

public User(String username, String email) {
    this.username = username;
    this.email = email;
}

public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

}

ОБНОВЛЕНИЕ

Я положил эти правила

{
  "rules": {
  ".read": "auth != null",
  ".write": "auth != null"
},
{
  "rules": {
  "comments": {
  ".write": "auth != null && root.child('Users').hasChild(auth.uid)"
  ".read": "auth != null"
  }
 }
 }  
}

, но я получаюошибка синтаксиса.

1 Ответ

0 голосов
/ 26 мая 2018

Нет автоматической связи между существованием вашего пользователя на панели аутентификации и данными пользователя в узле Users в вашей БД.Итак, как вы упомянули в своем посте, если вы удалите узел user в БД, он / она по-прежнему сможет аутентифицироваться.

Поэтому вам необходимо защитить свою базу данных выделенным правило безопасности (Рассмотрим его как авторизацию часть всего механизма аутентификация / авторизация ).

Вы должны написать это правило безопасности базы данных таким образомчто UID пользователя должен существовать в узле Users, чтобы он мог написать «комментарий» следующим образом:

{
  "rules": {
    "comments": {
      ".write": "auth != null && root.child('Users').hasChild(auth.uid)"
      ".read": ...
    }
  }
}

Здесь мы предполагаем, что узел comments напрямуюпод корнем базы данных.Вы можете адаптировать это правило к своей модели данных (и, возможно, включить в этот путь почтовый UID).

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

...