如何阻止Firebase用户登录到错误的登录屏幕

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何阻止Firebase用户登录到错误的登录屏幕相关的知识,希望对你有一定的参考价值。

上下文:在我的Firebase数据库中,我有一个名为“客户端”的父级,它根据客户端注册的数据将数据存储在“供应商”或“服务器”中。

问题:已注册的“供应商”可以登录为“Eater”,“Eater”可以登录为“Vendor”。使用当前代码,app仍然允许“供应商”登录“Eater”屏幕,反之亦然。

我需要做的是:只允许“供应商”登录供应商屏幕和“食者”屏幕中的“食者”。

错误:当Eater或Vendor登录到Eater屏幕时,我遇到此崩溃

@Overridepublic void onDataChange

“java.lang.NullPointerException:尝试在com.example.zzyzj.eloteroman.login.EatCornLoginActivity $ 4.onDataChange”的空对象引用上调用虚方法'boolean java.lang.Object.equals(java.lang.Object)'

    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())
                        circProgressBar.setVisibility(View.INVISIBLE);
                     else 
                        checkIfUserIsEaterOrVendor();
                    
                
            );
        
    );
  


   public void checkIfUserIsEaterOrVendor()
    FirebaseDatabase.getInstance().getReference().
            child("Clients").
            child(FirebaseAuth.getInstance().getCurrentUser().getUid()).
            child("Eater").addListenerForSingleValueEvent(new ValueEventListener() 

        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            if (dataSnapshot.getValue().equals("Eater")) 
                //Code if the user is Eater
                circProgressBar.setVisibility(View.INVISIBLE);
                Toast.makeText(EatCornLoginActivity.this, R.string.login_success_toast, Toast.LENGTH_SHORT).show();
                startActivity(new Intent(EatCornLoginActivity.this, MapsActivity.class));
             else 
                //Code if the user is Vendor trying to login as Eater
                circProgressBar.setVisibility(View.INVISIBLE);
                Toast.makeText(EatCornLoginActivity.this, R.string.login_failed_toast, Toast.LENGTH_SHORT).show();
            
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 
            Toast.makeText(getBaseContext(), databaseError.getMessage(),
                    Toast.LENGTH_SHORT).show();
        
    );

答案

您可以使用SharedPreferences.So您可以存储一个userid,其中包含注册用户类型的值,如果userid匹配为您的值,则检查登录,如果您愿意,可以登录。

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.example.pc.it7project.data", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString(firebaseAuth.getCurrentUser().getUid(), "Vendor");
editor.apply();

并且您使用此代码获得共享首选项的价值

SharedPreferences sharedPref = getApplicationContext().getSharedPreferences("com.example.pc.it7project.data", Context.MODE_PRIVATE);
String sc = sharedPref.getString(FirebaseAuth.getInstance().getUid(), "");

并检查

if(sc.equals("Vendor"))

//Put Your Code Here

我希望这可以帮到你!

谢谢。

另一答案

注册:

您应首先询问用户,要么是用户要注册为供应商,要么是食客。用户注册后,将其类型保存到firebase数据库中。

呃波什:

registered_user: + user_key:(。FirebaseAuth.getInstance()getCurrentUser()的getuid()); + user_type:vendor / eater(在user_key节点下)

登录:

您必须有两个按钮来区分登录e-g登录为供应商或登录为eater。 e-g如果用户点击登录为供应商,则将其类型通过意图传递给登录活动。

Intent intent = new Intent(StartScreen.this,LoginActivity.class); 
intent.putExtra("user_type","vendor"); 
startActivity(intent);

一旦经过身份验证,用户就会检查其类型

                if (!task.isSuccessful() && client_db )
                    circProgressBar.setVisibility(View.INVISIBLE);
                    Toast.makeText(EatCornLoginActivity.this, R.string.login_failed_toast, Toast.LENGTH_SHORT).show();
                 else 
                    circProgressBar.setVisibility(View.INVISIBLE);
                    Toast.makeText(EatCornLoginActivity.this, R.string.login_success_toast, Toast.LENGTH_SHORT).show();

                    // If Login/Registration Successful send user to MapsActivity
         checkUserValidation 


                

getIntent()。getStringExtra(“user_type”),将给出你从StratScreen.this传递的类型,所以如果你的user_type存在,那么你将传递给下一个活动,否则显示错误吐司

public void checkUserValidation()
    FirebaseDatabase.getInstance().getReference().child("registered_user").
            child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child(getIntent().getStringExtra("user_type")).addListenerForSingleValueEvent(new ValueEventListener() 
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
            if (dataSnapshot.getValue() != null) 
                startActivity(new Intent(EatCornLoginActivity.this, MapsActivity.class));
            else
        Log.e("notify","Error in login");
    
        

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) 

        
    );

PS:

如果你想使用SharePreferences然后它很容易做但是可能出现一个问题如果用户清除缓存或卸载然后重新安装应用程序,应用程序将无法找到Sharepreferences文件。 Sharepreferences将数据存储在本地文件中。

另一答案

我认为解决此问题的一个好方法是在Firebase数据库中为每个用户添加一个新字段,指示它是供应商还是供应商。创建帐户时可以填充此字段。接下来,当有人想要登录时,您应首先检查是否是供应商尝试登录供应商屏幕或Eater屏幕,反之亦然。这样您就可以确定用户的类型。你可以用你的实现做到这一点,或者我错过了什么?

功能示例:

    public void checkUserType()
        FirebaseDatabase.getInstance().getReference().
                child("Users").
                child(FirebaseAuth.getInstance().getCurrentUser().getUid()).
                child("user_type").addListenerForSingleValueEvent(new ValueEventListener() 

            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
                if (dataSnapshot.getValue().equals("Vendor")) 
                    //Code if the user is Vendor depending on the screen
                 else 
                    //Code if the user is Eater depending on the screen
                
            

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) 
                log.e(databaseError);
            
        );
     
另一答案

您应该首先登录并获取用户ID,然后使用它来查询食者参考,然后如果该用户存在则进入食客者屏幕,否则转到供应商屏幕

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

            

            // ...
        
    );

以上是关于如何阻止Firebase用户登录到错误的登录屏幕的主要内容,如果未能解决你的问题,请参考以下文章

刷新后如何让用户保持登录到 Firebase 应用程序?

在 React.JS 中刷新后,如何让用户保持登录到 firebase?

将登录屏幕切换到家庭 firebase 和 google

Firebase onAuthStateChanged unsubscribe 不是函数错误

阻止用户在 React Native 中成功登录后返回登录屏幕

Firebase Auth - createUserWithEmailAndPassword() - 在验证电子邮件之前阻止登录