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

时间:2019-03-14 07:30:43

标签: java android firebase

上下文:在我的Firebase数据库中,有一个名为“客户端”的父项,根据将其注册为哪个客户端,将数据存储在“供应商”或“食客”中。

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

我需要做什么::仅允许“供应商”登录“供应商”屏幕,并在“食者”屏幕中登录“食者”。

错误:当Eater或供应商登录

上的Eater屏幕时,出现此崩溃

@Overridepublic void onDataChange

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

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

4 个答案:

答案 0 :(得分:1)

您可以使用SharedPreferences。因此,您可以存储一个用户ID,其值为注册的用户类型,并检查登录名是否与您的用户ID匹配,以便您登录。<​​/ p>

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
}

希望这对您有帮助!

谢谢。

答案 1 :(得分:1)

用于注册:

  

您应该首先询问用户,该用户想注册为供应商还是食用者。一旦   用户自行注册,然后将其类型保存到Firebase数据库中。

e-g bleow:

  

注册用户:
  + user_key:(FirebaseAuth.getInstance()。getCurrentUser()。getUid());
  + user_type:供应商/食者(在user_key节点下)​​

用于登录:

  

您必须有两个按钮才能区分登录e-g登录为供应商还是   以食客身份登录。 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,那么很容易做到,但是一个   如果用户清除缓存或卸载,则可能会出现问题,然后重新安装   应用程序将无法找到   共享首选项文件。共享首选项将数据存储在本地文件中。

答案 2 :(得分:1)

我认为解决此问题的一种好方法是在Firebase数据库中为每个用户添加一个新字段,指示该字段是供应商还是Eater。创建帐户时可以填充此字段。接下来,当有人要登录时,您应该首先检查它是试图在供应商屏幕还是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);
            }
        });
     }

答案 3 :(得分:1)

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

text