webentwicklung-frage-antwort-db.com.de

Android - Firebase - Verschiedene Arten der Benutzeranmeldung

Ziel

Zulassen, dass sich verschiedene Benutzertypen bei ihren jeweiligen Schnittstellen anmelden können

Beschreibung

  • Arten von Benutzern (3): 

    1. Student
    2. Elternteil
    3. Lehrer
  • Jeder Benutzer wird über die Firebase-Authentifizierungs-E-Mail registriert

  • Jeder Benutzer sollte in der Lage sein, auf seine jeweiligen Schnittstellen als jede Schnittstelle zuzugreifen, wenn er sich voneinander unterscheidet

  • Jeder Benutzer wurde bereits mit seinen entsprechenden untergeordneten Knoten in der Firebase-Datenbank gespeichert. Zum Beispiel gibt es unter "Benutzer" eine "Schule" und darunter die Benutzertypen wie "Schüler", "Eltern" und "Lehrer".

Datenbank zur Visualisierung

  • Benutzer

-> Schule

------> Student

------> Elternteil

------> Lehrer

 enter image description here

Problem

Da ich derzeit Firebase-Authentifizierungs-E-Mail verwende, kann ich nicht unterscheiden, welcher Benutzer welcher ist. 

Eine vorgeschlagene Lösung, bei der ein Optionsfeld mit drei Benutzerarten erstellt wird, die der Benutzer auswählen kann, wenn er sich in der App anmeldet. Dies bedeutet, dass sich der Benutzer anmelden muss, indem er seine E-Mail-Adresse, das Kennwort und den Benutzertyp auswählt. 

Das Problem dabei ist, dass, wenn der Benutzer "Student" unter "Radio" die Option "Eltern" oder "Lehrer" auswählt und sich mit einer Student-E-Mail anmeldet, die App die "Student"-E-Mail trotzdem als "Eltern" oder "erkennt". Lehrer"

LoginActivity-Klasse

import Android.content.Intent;
import Android.support.annotation.NonNull;
import Android.support.v7.app.AppCompatActivity;
import Android.os.Bundle;
import Android.support.v7.widget.Toolbar;
import Android.text.TextUtils;
import Android.util.Log;
import Android.view.View;
import Android.widget.Button;
import Android.widget.EditText;
import Android.widget.Toast;

import com.google.Android.gms.tasks.OnCompleteListener;
import com.google.Android.gms.tasks.Task;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthException;

public class LoginActivity extends AppCompatActivity {

    private Toolbar jLoginToolbar;

    private EditText jLoginEmail;
    private EditText jLoginPassword;

    private Button jLoginBtn;
    private Button jAdminLoginBtn;
    private FirebaseAuth mAuth;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        mAuth = FirebaseAuth.getInstance();

        jLoginToolbar = (Toolbar) findViewById(R.id.loginToolbar);
        setSupportActionBar(jLoginToolbar);
        getSupportActionBar().setTitle("Account Login");
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);

        jLoginEmail = (EditText) findViewById(R.id.loginEmail);
        jLoginPassword = (EditText) findViewById(R.id.loginPassword);
        jLoginBtn = (Button) findViewById(R.id.loginBtn);
        jAdminLoginBtn = (Button) findViewById(R.id.loginAdminBtn);

        jAdminLoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                    Intent intentAdmin = new Intent(LoginActivity.this, AdminLoginActivity.class);
                    startActivity(intentAdmin);
            }
        });

        jLoginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userLoginEmail = jLoginEmail.getText().toString();
                String userLoginPassword = jLoginPassword.getText().toString();

                if(!TextUtils.isEmpty(userLoginEmail)&& !TextUtils.isEmpty(userLoginPassword)) {
                    loginUser(userLoginEmail, userLoginPassword);
                }else{
                    Toast.makeText(LoginActivity.this, "Failed Login: Empty Inputs are not allowed", Toast.LENGTH_SHORT).show();
                }
            }
        });

    }

    private void loginUser(final String userLoginEmail, final String userLoginPassword) {
        mAuth.signInWithEmailAndPassword(userLoginEmail, userLoginPassword)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if (task.isSuccessful()) {
                            Intent intentMain = new Intent(LoginActivity.this, MainActivity.class);
                            intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                            startActivity(intentMain);
                            finish();
                        }else{
                            FirebaseAuthException e = (FirebaseAuthException )task.getException();
                            Toast.makeText(LoginActivity.this, "Failed Login: "+e.getMessage(), Toast.LENGTH_SHORT).show();
                            return;
                        }
                    }
                });
    }
}

Meine vorgeschlagene Lösung (unvollständig)

Ich dachte, ich sollte "UserCode" für jeden Benutzer fest codieren

Zum Beispiel kann jeder Benutzer neben seinem jeweiligen "Usercode"

"Student" = "Student123"

"Parent" = "Parent123"

"Teacher" = "Teacher123"

Ein Codebeispiel wird so sein

    if(task.isSuccessful() && userCode.equals("Student123")){
    //Send user to Student Interface
}else if(task.isSuccessful() && userCode.equals("Parent123")){
    //Send user to Parent Interface
}else if(task.isSuccessful() && userCode.equals("Teacher123")){
    //Send user to Teacher Interface
}

Der UserCode ist ein EditText, der es dem Benutzer ermöglicht, den "UserCode" einzugeben, obwohl das Konzept dieser Idee dem des Radioknopfes ähnelt. Es bietet mehr Sicherheit, da der "UserCode" als "sekundäres" Kennwort fungiert in dem die Benutzer es nur von mir wissen werden (Admin). Gib mir deine Gedanken


>>>>>>>>>>>>>>>>>>>>>>>>>>>>> LÖSUNG <<<<<<<<<<<<<<<<<<<<<<< <<<<<<<<

Lösung - Beschreibung

Nachdem der Benutzer Authenticated über die Firebase-E-Mail-Authentifizierung ist, wird in der Funktion "loginUser" eine If-else-Anweisung ausgeführt, die bestimmt, ob der authentifizierte Benutzer als "Student", "Parent" oder "Teacher" registriert wurde ". 

  • Hinweis

Registrieren Sie während der Registrierung eine "userType" -Variable für den Benutzer. Der "userType" wird in der Datenbankstruktur gespeichert. Auf diese Weise können Sie es anrufen, um den Benutzertyp während der Anmeldesitzung zu überprüfen

Lösung - Beispielcode

private void loginUser(final String userLoginEmail, final String userLoginPassword) {
        mAuthLogin.signInWithEmailAndPassword(userLoginEmail, userLoginPassword)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        if(task.isSuccessful()){

                            FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser();
                            String RegisteredUserID = currentUser.getUid();

                            jLoginDatabase = FirebaseDatabase.getInstance().getReference().child("Users").child(RegisteredUserID);

                            jLoginDatabase.addValueEventListener(new ValueEventListener() {
                                @Override
                                public void onDataChange(DataSnapshot dataSnapshot) {
                                    String userType = dataSnapshot.child("userType").getValue().toString();
                                    if(userType.equals("Resident")){
                                        Intent intentResident = new Intent(LoginActivity.this, ResidentActivity.class);
                                        intentResident.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                        startActivity(intentResident);
                                        finish();
                                    }else if(userType.equals("Guard")){
                                        Intent intentMain = new Intent(LoginActivity.this, SecurityGuardActivity.class);
                                        intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                        startActivity(intentMain);
                                        finish();
                                    }else if(userType.equals("Police")){
                                        Intent intentMain = new Intent(LoginActivity.this, PoliceActivity.class);
                                        intentMain.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                                        startActivity(intentMain);
                                        finish();
                                    }else{
                                        Toast.makeText(LoginActivity.this, "Failed Login. Please Try Again", Toast.LENGTH_SHORT).show();
                                        return;
                                    }
                                }

                                @Override
                                public void onCancelled(DatabaseError databaseError) {

                                }
                            });
                        }
                    }
                });
    }
7

Sie benötigen lediglich eine Möglichkeit, um zu überprüfen, ob der Benutzer ein Elternteil, Schüler oder Lehrer ist, wenn er sich zum ersten Mal für die App anmeldet. Danach fügen Sie eine 'Typ'-Variable in ihren Benutzerinformationsbereich der Firebase-Datenbank ein (Typ = Eltern, Schüler oder Lehrer). Wenn sie sich anmelden, rufen Sie ihren 'Typ' ab. Und zeigen Sie die richtige entsprechende Schnittstelle.

  • sie müssen noch 1 weitere parameter as a type nehmen

  • In welchem ​​wenn user's student login ist es leicht differentiatable in database

  • sie müssen entsprechend Ihrem Bedarf database table erstellen

Ich helfe Ihnen gerne

2
Vishal Yadav