Запрос базы данных, чтобы убедиться, что новые пользователи не регистрируются с уже существующим именем пользователя - PullRequest
0 голосов
/ 26 мая 2020

Я пытаюсь достичь, когда регистрируется новый пользователь, я хотел бы выполнить запрос, чтобы убедиться, что выбранное имя пользователя не принадлежит другому пользователю. Для этого я написал метод register();, но он мне ничего не возвращает, ни сообщение Toast, указывающее, что имя пользователя уже занято, и не переводит меня на следующую страницу, указывающую, что письмо было отправлено. отправлено, и пользователь должен войти в систему.

Может ли кто-нибудь объяснить мне, что я делаю неправильно?

RegisterActivity

private void register(final String username, final String fullname, String email, String password) {
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users");
        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                boolean ifUsernameExists = false;
                for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                    User user = snapshot.getValue(User.class);
                    if (user != null) {
                        if (username.equals(user.getUsername())) {
                            Toast.makeText(RegisterActivity.this, "That username has already been taken. Try another", Toast.LENGTH_SHORT).show();
                            ifUsernameExists = true;
                        }
                    }
                }

                if (!ifUsernameExists) {
                    mAuth.createUserWithEmailAndPassword(email, password).addOnCompleteListener(RegisterActivity.this, task -> {
                        if (task.isSuccessful()) {
                            sendVerificationEmail();
                            FirebaseUser firebaseUser = mAuth.getCurrentUser();
                            String userid = firebaseUser.getUid();

                            mReference = FirebaseDatabase.getInstance().getReference().child("Users").child(userid);

                            HashMap<String, Object> hashMap = new HashMap<>();
                            hashMap.put("id", userid);
                            hashMap.put("email", email);
                            hashMap.put("username", username.toLowerCase());
                            hashMap.put("fullname", fullname);
                            hashMap.put("bio", "");
                            hashMap.put("imageurl", "https://firebasestorage.googleapis.com/v0/b/events-50eda.appspot.com/o/Placeholder.png?alt=media&token=0e651fa8-32e9-4f42-be9a-a5365f44b0f4");

                            mReference.setValue(hashMap).addOnCompleteListener(task1 -> {
                                if (task1.isSuccessful()) {
                                    FirebaseAuth.getInstance().signOut();
                                    Intent intent = new Intent(RegisterActivity.this, LoginActivity.class);
                                    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
                                    startActivity(intent);
                                }
                            });
                        } else {
                            Toast.makeText(RegisterActivity.this, "You can't register with that email", Toast.LENGTH_LONG).show();
                            mProgressDialog.dismiss();
                        }
                    });
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {

            }
        });
    }

Ответы [ 2 ]

0 голосов
/ 27 мая 2020

Первая часть проблемы была решена в соответствии с комментарием OP:

Я понял, что на самом деле вся моя проблема заключалась в правилах Firebase.

Использование информации в ответ из следующего сообщения:

Что, если бы я просто хотел используйте a для l oop и просмотрите все имена пользователей?

Вы не сможете этого сделать, если не аутентифицированы.

Как я уже сказал, метод, который я написал, работает, Мне просто нужно сделать так, чтобы неаутентифицированный пользователь мог читать, чтобы увидеть, может ли имя пользователя существовать, а затем записывать в базу данных, то есть сохранять свои данные в Firebase.

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

{
  "rules": {
      ".read": true,
      ".write": true
  }
}

Но не рекомендуется, потому что эти правила безопасности определены как publi c, и любой может украсть, изменить или удалить данные в вашем база данных.

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

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

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

...