0
votes

Comment puis-je empêcher l'utilisateur de Firebase de se connecter à un mauvais écran de connexion

contexte : dans ma base de données de Firebase, j'ai un parent appelé "clients" qui stocke des données dans "vendeur" ou "mangeur" ​​en fonction duquel le client est enregistré comme.

problème : "Vendor" enregistré peut se connecter en tant que "mangeur" ​​et "mangeur" ​​peut se connecter comme "vendeur". Avec Code actuel, l'application permet toujours à «Vendor» de se connecter à l'écran «Mangeur» et inversement.

Ce que j'ai besoin de faire: n'autorise que "le fournisseur" de connecter l'écran du fournisseur et "mangeur" ​​dans l'écran du mangeur.

Erreurs strides: Je reçois ce crash lorsqu'un mangeur ou un fournisseur de connexion à l'écran de mangeur sur le vide

@overridePublic Void OndataChange

"java.lang.nullpointereException: tentative d'invoquer la méthode virtuelle 'booléenne java.lang.object.equals (java.lang.object)' sur une référence objet nulle à com.example.zzyzj.eloteroman.login.eatcornloginactivité $ 4.Dontatachange " xxx


9 commentaires

Je ne comprends pas ce que tu veux?


Ce pourrait vous aider.


Mis à jour le code et la mise en page de la question


Lorsque vous dites, le fournisseur peut se connecter sous forme de mangeur et de mangeur peut se connecter en tant que fournisseur, est-ce qu'il y a un commutateur sur l'écran de connexion de l'utilisateur pour sélectionner le flux ou vous affichez le flux approprié en fonction des informations d'identification?


DataSnapshot.getvalue () est NULL et à cause d'une exception NULL Pointer est lancée. Donc, vérifiez que les nulls avant de le comacher avec mangeur


Lorsque l'utilisateur ouvre l'application, ils sont donnés aux options du bouton; un pour être un vendeur et un autre pour être un mangeur. S'ils cliquent sur le fournisseur, ils se rendent à l'écran d'enregistrement / login du fournisseur. Ensuite, lorsqu'ils se connectent, ils sont envoyés à l'activité Vendormaps. Même chose pour le mangeur sauf qu'ils sont envoyés à l'activité des cartes du mangeur.


Alors quelque chose comme if (datasnapshot.getvalue () == null) {datasnapshot.getvalue (). Equals ("mangeur") ?


Petit changement, quelque chose comme if (datasnapshot.getvalue ()! = Null) {datasnapshot.getvalue (). Equals ("mangeur")


J'ai hâte d'essayer cela, je dois dormir maintenant, je vous tiendrai au courant, merci!


4 Réponses :


1
votes

Vous pouvez utiliser SharedPreferences.SO Vous pouvez enregistrer un ID utilisateur avec la valeur du type d'utilisateur enregistré et vérifier la connexion si l'ID utilisateur correspond à votre valeur, il peut se connecter si vous le souhaitez.

if(sc.equals("Vendor"))
{
//Put Your Code Here
}


1 commentaires

Cela semble prometteur. Je me demande, existe-t-il un moyen d'obtenir le nom de l'enfant que l'UID est stockée et transmettait cela comme référence pour vérifier si l'utilisateur UID correspond à l'enfant que l'UID est stockée? Je pense à cela afin d'empêcher les bugs à l'avenir si un utilisateur désinstalle l'application ou l'installe sur un nouveau téléphone.



1
votes

pour inscription:

Vous devez d'abord demander à l'utilisateur, que ce soit que l'utilisateur souhaite vous inscrire en tant que fournisseur ou mangeur. Une fois que L'utilisateur s'est inscrit, puis enregistrez son type dans la base de données Firebase.

E-G Blowow:

Recommande_utilisateur:

+ user_key: (Firebaseauth.getinstance (). GetCurrentUser (). Getuid ());
+ user_type: fournisseur / mangeur (sous Noeud_key node)

pour la connexion:

Vous devez avoir deux boutons pour différencier la connexion E-G Connect en tant que vendeur ou Connectez-vous comme mangeur. E-G Si l'utilisateur cliquez sur Connexion comme fournisseur puis transmettez-le Tapez à travers l'intention de vous connecter activiy. xxx

une fois l'utilisateur authentifié, vérifiez ensuite son type xxx blockQuote>

getintent (). getstringextra ("user_type"), donnera au type que vous passé de stratcreen.C'est donc si votre utilisateur_type existe alors vous passera à une activité suivante autrement montrer une erreur toast xxx

ps:

Si vous voulez que vous souhaitez utiliser SharePreferences, il est facile de faire mais un problème peut survenir si l'utilisateur CLEAR Cache ou la désinstallation puis réinstallez la application L'application ne serait pas en mesure de trouver le Fichier SharePreferences. SharePreferences stocke des données dans le fichier local.


1 commentaires

Bonne mise en page pour l'aide. Je vais sans utiliser de Pref partagé à cause de vos conseils. J'ai mis à jour mon poste et je suis presque terminé mais je rencontre toujours une erreur et un accident.



1
votes

Je pense qu'un bon moyen de résoudre ce problème augmenterait un nouveau champ dans votre base de données Firebase pour chaque utilisateur indiquant s'il s'agit d'un fournisseur ou d'un mangeur. Ce champ peut être rempli lors de la création d'un compte. Ensuite, lorsque quelqu'un veut vous connecter, vous devez d'abord vérifier s'il s'agit d'un fournisseur qui tente de vous connecter à l'écran du fournisseur ou à l'écran de mangeur et inversement. De cette façon, vous saurez certainement le type de l'utilisateur. Pouvez-vous faire cela avec votre implémentation ou je manque quelque chose?

Exemple fonction: xxx


9 commentaires

Veuillez envisager de poster cette réponse comme un commentaire ou essayez d'ajouter du code dans la réponse.


Cela semble vraiment propre. J'aime ça. Je stockerais alors l'intention de connecter l'utilisateur dans l'instruction si (DataSnapshot.getvalue (). Equals ("Vendor")) correct?


Découvrez mon poste mis à jour, j'ai utilisé une partie de ce code mais j'ai toujours une erreur de crash. Presque là


Je pense que le pointeur NULL est parce que vous n'avez pas de valeur de mangeur dans la base de données. Firebasedatabase.getinstance (). GetReference (). enfant ("clients"). Enfant (Firebaseauth.GetInstance (). GetCurrentatuser (). Getuid ()). enfant ("mangeur"). addlistenerforsinglevalueEvent (nouveau valuantEveillanceListener () {retournera la valeur du mangeur. Je suggère d'ajouter du champ de catégorie au lieu de mangeur en Firebase et dans ce champ Ajouter un mangeur en tant que chaîne si l'utilisateur est un mangeur et un fournisseur si l'utilisateur est Vendeur, de cette façon, vous distinguerez les utilisateurs et être capable de comparer avec des anneaux. ().


Vous pouvez faire la même chose avec Boolean, par exemple True - Mangeur, False - Vendeur, mais vous devrez modifier la partie Datasnapshot.getvalue (). Equals ("Vendeur") partie à Datasnapshot.getvalue () == vrai, ou juste datasnapshot.getvalue ().


Merci pour les réponses. La chose étrange est que j'ai une valeur de mangeur dans la base de données. C'est comme ça que je crée l'utilisateur lors de son inscription en tant que mangeur: string client_id = firebaseauth.getcurrentUser (). GetUID (); DatabaseReferenceReference client_db = Firebasedatabase.getinstance (). GetReference (). Enfant ("Clients") .child ("mangeur"). Ch Iild (client_id); client_db.setvalue (vrai);


Ow, vous devriez peut-être envisager de changer la base de données, car avec cette approche, il sera très difficile de trouver quel utilisateur est un mangeur ou un vendeur.


Je ferais certitude que je envisagerais de changer la base de données. Donc, à ce moment-là, la façon dont c'est, cela crée un enfant client, puis s'ils s'inscrivent comme un fournisseur, il met ces données dans un enfant de fournisseur au sein des clients. Idem pour le mangeur. Ce n'est pas la meilleure façon de le faire?


Pour la flexibilité dont vous avez besoin, je créerais des clients enfants et à l'intérieur, je créerais des utilisateurs avec 3 paramètres: email, nom, booléen (fournisseur ou client). Vous pouvez plus tard ajouter plus si nécessaire.



1
votes

Vous devez d'abord vous connecter et obtenir l'ID utilisateur, puis utiliser cela pour interroger la référence du mangeur, puis si cet utilisateur existe à l'écran du mangeur d'autre d'aller à l'écran du fournisseur

loginButton.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View v) {

        circProgressBar.setVisibility(View.VISIBLE);
        final String emailUser = emailEditText.getText().toString();
        final String passwordUser = passwordEditText.getText().toString();

       firebaseAuth.signInWithEmailAndPassword(emailUser, passwordUser)
      .addOnCompleteListener(EatCornLoginActivity.this, new 
       OnCompleteListener<AuthResult>() {
          @Override
          public void onComplete(@NonNull Task<AuthResult> task) {
              if (task.isSuccessful()) {

                  Log.d(TAG, "createUserWithEmail:success");
                  FirebaseUser user = mAuth.getCurrentUser();

                  DatabaseReference client_db = 
                FirebaseDatabase.getInstance().getReference().child("Clients")
                .child("Eater")
                .child(user.getUid());

             client_db.addListenerForSingleValueEvent(new ValueEventListener() 

             {

                 @Override
                 public void onDataChange(DataSnapshot dataSnapshot) {
                   if (snapshot.exists()) {
                       // go to eater activity
                   }else{
                     //go to vendor activity
                    }

                 }

              @Override
             public void onCancelled(FirebaseError firebaseError) {
             Toast.makeText(getContext(), firebaseError.getMessage(), 
             Toast.LENGTH_SHORT).show();
           }
       });


    } else {
           // If sign in fails, display a message to the user.
           Log.w(TAG, "createUserWithEmail:failure", 
           task.getException());
           Toast.makeText(EmailPasswordActivity.this, "Authentication 
                failed.", Toast.LENGTH_SHORT).show();

            }

            // ...
        }
    });


3 commentaires

Cela a l'air vraiment bon et facile à utiliser. Ce que je pense que je pouvais faire, c'est si (instantané.exists ()) pour le fournisseur et qu'ils essaient de se connecter avec l'écran du fournisseur, cela fonctionnera et les logera, sinon il aura une erreur. Je vais essayer ça.


J'ai utilisé ce code et obtenez une erreur, j'ai mis à jour le message d'origine


Votre nouveau code s'écrasera si cet utilisateur n'a aucune valeur dans sa section Modifier. Donc, vous devriez d'abord faire un chèque si l'instantané est null