Android – Firebase – 不同类型的用户登录

目标

允许不同类型的用户登录其各自的界面

描述

  • 用户类型(3):

    1. 学生
    2. 老师
  • 每个用户都通过Firebase身份validation电子邮件注册

  • 如果每个接口与另一个接口不同,则每个用户应该能够访问其各自的接口

  • 每个用户都已与Firebase数据库中的各自子节点一起保存。 例如,在“用户”下面有一个“学校”,其下是用户类型,如“学生”,“家长”和“老师”。

用于可视化目的的数据库

  • 用户

– >学校

——>学生

——>父母

——>老师

在此处输入图像描述

问题

由于我目前正在使用Firebase身份validation电子邮件,因此我无法区分哪个用户是哪个。

建议的解决方案是创建具有3种类型用户的单选按钮,供用户在登录应用程序时进行选择。 这意味着用户必须通过输入他们的电子邮件,密码和选择他们的用户类型来登录。

问题是,如果“学生”用户在单选按钮上选择“父母”或“老师”并使用学生电子邮件登录,该应用程序仍会将“学生”电子邮件识别为“父母”或“老师”

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() { @Override public void onComplete(@NonNull Task 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; } } }); } } 

我建议的解决方案(不完整)

我在想我应该为每个用户硬编码“UserCode”

例如,每个用户旁边各自的“用户代码”

“学生”=“学生123”

“父母”=“父母123”

“老师”=“老师123”

代码示例将是这样的

  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 } 

UserCode将是一个EditText,允许用户输入“userCode”,即使这个想法的概念类似于单选按钮的概念,它将提供更多的安全性,因为“userCode”充当“辅助”密码用户只能从我这里知道(管理员)。 把你的想法告诉我


>>>>>>>>>>>>>>>>>>>>>>>>>>>解决方案<<<<<<<<<<<<<<<<<<<<<< <<<<<

解决方案 – 说明

用户通过Firebase电子邮件身份validation进行身份validation后,将在“loginUser”函​​数中运行If else语句,该函数将确定Authenticated用户是否已注册为“Student”,“Parent”或“Teacher”。

  • 注意

在注册期间,为用户注册“userType”变量。 “userType”将存储在数据库树中。 这样,您就可以在登录会话期间调用它来validation用户的类型

解决方案 – 示例代码

 private void loginUser(final String userLoginEmail, final String userLoginPassword) { mAuthLogin.signInWithEmailAndPassword(userLoginEmail, userLoginPassword) .addOnCompleteListener(this, new OnCompleteListener() { @Override public void onComplete(@NonNull Task 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) { } }); } } }); } 

您只需要在首次注册应用时validation用户是家长,学生还是教师。 之后,您在Firebase数据库的用户信息部分(type = Parent,student或teacher)中添加了“type”变量。 然后,当他们登录时,您将检索他们的“类型”。 并显示正确的相应界面。

  • 你需要再增加一个parameter as a type

  • 如果user's student login ,则很容易在database differentiatable

  • 您需要根据需要创建database table

很高兴为您服务