Как перенаправить несколько типов пользователей к их соответствующим действиям?
Я создаю приложение для голосования на Firebase. У меня есть 3 типа пользователей. Пока я могу успешно перенаправлять 2 типа пользователей (студентов, преподавателей) на их соответствующие действия после входа в систему с помощью приведенного ниже кода, пока МОИ пользователи Но теперь я должен добавить другого пользователя (АДМИНИСТРАТОРА) и, как и другие пользователи, администратор тоже должен быть перенаправлен на их собственные конкретные действия после входа в систему. Я не знаю, как изменить мой код для третьего пользователя.
mAuthListener = new FirebaseAuth.AuthStateListener() {
@Override
public void onAuthStateChanged(FirebaseAuth firebaseAuth) {
FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();
if (mAuth.getCurrentUser() != null) {
String uid = mAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
uidRef = rootRef.child("STUDENTS").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(com.google.firebase.database.DataSnapshot dataSnapshot) {
if (dataSnapshot.exists()) {
//start students activity
startActivity(new Intent(MainActivity.this, student.class));
} else {
//start teachers activity
startActivity(new Intent(MainActivity.this, teacher.class));
}
}
//
@Override
public void onCancelled(DatabaseError databaseError)
{
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
}
else{
Log.d("TAG", "firebaseUser is null");
}
}
};
Переведено автоматически
Ответ 1
Использование onlye if (dataSnapshot.exists())
не решит вашу проблему с тремя типами пользователей. Предполагая, что тип третьего пользователя - 3
, необходимо изменение структуры вашей базы данных. Итак, ваша новая схема базы данных должна выглядеть следующим образом:
Firebase-root
|
--- users
|
--- uidOne
| |
| --- name: "Ed"
| |
| --- type: 1
|
--- uidTwo
| |
| --- name: "Tyff"
| |
| --- type: 2
|
--- uidOne
|
--- name: "Admin"
|
--- type: 3
Теперь вы должны добавить прослушиватель на uid
узле и проверить тип пользователя следующим образом:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference uidRef = rootRef.child("users").child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.child("Type").getValue(Long.class) == 1) {
startActivity(new Intent(MainActivity.this, student.class));
} else if (dataSnapshot.child("TYPE").getValue(Long.class) == 2) {
startActivity(new Intent(MainActivity.this, teacher.class));
} else if (dataSnapshot.child("TYPE").getValue(Long.class) == 3) {
startActivity(new Intent(MainActivity.this, admin.class));
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
Ответ 2
вам нужна другая структура данных, с users
и roles/admin
, roles/teacher
, roles/student
а затем проверьте, у какого узла есть ключ (также совместимый с правилами безопасности).
поскольку у вас это есть, вы могли бы просто удалить else
ветку и запросить все три узла.
Ответ 3
Это мой окончательный код с использованием Kotlin, и он работает отлично.
mAuth.signInWithEmailAndPassword(Email, Password).addOnCompleteListener { task ->
if (task.isSuccessful) {
val uid = FirebaseAuth.getInstance().currentUser!!.uid
val rootRef = FirebaseDatabase.getInstance().reference
val uidRef = rootRef.child("Users").child(uid)
val spin: String = userchioce.selectedItem.toString()
val valueEventListener: ValueEventListener = object : ValueEventListener {
override fun onDataChange(dataSnapshot: DataSnapshot) {
when {
dataSnapshot.child("users").getValue(String::class.java) == "Admin" -> {
if (spin.equals("Admin")){
val intent = Intent(this@Login, Admin::class.java)
startActivity(intent)}
else{
Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
.show()
}
}
dataSnapshot.child("users").getValue(String::class.java) == "Lecturer" -> {
if (spin.equals("Lecturer")) {
val intent = Intent(this@Login, Lecturer::class.java)
startActivity(intent)
}else{
Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
.show()
}
}
dataSnapshot.child("users").getValue(String::class.java) == "Parent" -> {
if (spin.equals("Parent")) {
val intent = Intent(this@Login, Parent::class.java)
startActivity(intent)
}else{
Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
.show()
}
}
dataSnapshot.child("users").getValue(String::class.java) == "Student" -> {
if (spin.equals("Student")) {
val intent = Intent(this@Login, Student::class.java)
startActivity(intent)
}else{
Toast.makeText(this@Login, "Select Your User-Type", Toast.LENGTH_SHORT)
.show()
}
}
}
}
override fun onCancelled(databaseError: DatabaseError) {
Log.d(TAG, databaseError.message)
}
}
uidRef.addListenerForSingleValueEvent(valueEventListener)
progressDialog.dismiss()
}