web-dev-qa-db-fra.com

Android - Firebase - Différents types de connexion utilisateur

But

Autoriser différents types d'utilisateurs à se connecter à leurs interfaces respectives

Description

  • Types d'utilisateurs (3): 

    1. Étudiant
    2. Parent
    3. Prof
  • Chaque utilisateur est enregistré via Firebase Authentication Email

  • Chaque utilisateur devrait pouvoir accéder à ses interfaces respectives en tant qu’interface différente de l’autre.

  • Chaque utilisateur a déjà été enregistré avec ses nœuds enfants respectifs dans la base de données Firebase. Par exemple, sous "Utilisateurs", il y a une "école" et sous ce sont les types d'utilisateurs tels que "Étudiant", "Parent" et "Enseignant".

Base de données à des fins de visualisation

  • Utilisateurs

-> école

------> Étudiant

------> Parent

------> Enseignant

 enter image description here

Problème

Étant donné que j'utilise actuellement le courrier électronique d'authentification Firebase, je ne parviens pas à distinguer quel utilisateur est quel utilisateur. 

Une solution proposée qui consiste à créer un bouton radio avec 3 types d'utilisateurs à sélectionner par l'utilisateur lors de la connexion à l'application. Cela signifie que l'utilisateur devra se connecter en saisissant son email, son mot de passe et en sélectionnant son type d'utilisateur. 

Le problème, c’est que si l’utilisateur «Étudiant» sélectionne «Parent» ou «Enseignant» sur le bouton radio et s’identifie à l’aide d’un email de l’étudiant, l’application reconnaîtra quand même l’e-mail «Étudiant» en tant que «parent» ou « Prof"

Classe LoginActivity

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;
                        }
                    }
                });
    }
}

Ma solution proposée (incomplète)

Je pensais que je devrais coder en dur "UserCode" pour chaque utilisateur

Par exemple, chaque utilisateur à côté de son "code d'utilisateur" respectif

"Student" = "Student123"

"Parent" = "Parent123"

"Teacher" = "Teacher123"

Un exemple de code sera comme ça

    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
}

Le UserCode sera un EditText qui permettra à l'utilisateur d'entrer le "userCode" même si le concept de cette idée est similaire à celui du bouton radio, il fournira plus de sécurité car le "userCode" agit comme un mot de passe "secondaire". dans lequel les utilisateurs ne le sauront que de moi (administrateur). Donne moi tes pensées


>>>>>>>>>>>>>>>>>>>>>>>>>>> SOLUTION <<<<<<<<<<<<<<<<<<< <<<<<<<<

Solution - Description

Une fois que l'utilisateur est Authenticated via l'authentification de messagerie Firebase, une instruction If else sera exécutée dans la fonction "loginUser", ce qui déterminera si l'utilisateur authentifié a été enregistré comme "étudiant", "parent" ou "enseignant". ". 

  • Remarque

Lors de l’enregistrement, enregistrez une variable "userType" pour l’utilisateur. Le "userType" sera stocké dans l'arborescence de la base de données. De cette façon, vous pourrez l'appeler pour vérifier le type d'utilisateur pendant la session de connexion.

Solution - Exemple de code

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
The Employee 123

Tout ce dont vous avez besoin est un moyen de vérifier que l'utilisateur est un parent, un étudiant ou un enseignant lors de sa première inscription à l'application. Ensuite, vous insérez une variable "type" dans la section d'informations utilisateur de la base de données Firebase (type = parent, élève ou enseignant). Ensuite, quand ils se connectent, vous récupérez leur "type". Et affichez la bonne interface correspondante.

2
  • vous devez prendre 1 plus parameter as a type

  • Dans lequel si user's student login il est facile de differentiatable dans database

  • vous devez créer database table en fonction de vos besoins

Heureux de vous aider

2
Vishal Yadav