邮箱验证后如何不使用usertype字段实现学生、教师账号分别登录
Firebase Auth 无usertype字段身份判定登录实现方案
实现逻辑
原方案通过读取usertype字段区分身份,调整后逻辑为:
- 登录校验通过且邮箱验证完成后,获取当前登录用户的UID
- 分别校验该UID是否存在于
USER节点下的Student/Teacher分支,根据存在的分支判定用户身份,跳转对应页面 - 实时数据库结构参考:

修改后的核心代码
你只需要替换原userLogin方法中邮箱验证通过后的逻辑即可,完整修改后的代码如下:
public class Login extends AppCompatActivity implements View.OnClickListener { private TextView signUp; private Button login; private TextInputEditText email, password; private FirebaseAuth mAuth; private ProgressBar progressBar; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); signUp = findViewById(R.id.signup); signUp.setOnClickListener(this); login = findViewById(R.id.btnLogin); login.setOnClickListener(this); email = findViewById(R.id.email_input_login); password = findViewById(R.id.password_input_login); progressBar = findViewById(R.id.progressBar); mAuth = FirebaseAuth.getInstance(); } @Override public void onClick(View v) { switch (v.getId()){ case R.id.signup: startActivity(new Intent(this, Signup.class)); break; case R.id.btnLogin: userLogin(); break; } } private void userLogin() { String Email = email.getText().toString().trim(); String Password = password.getText().toString().trim(); if (Email.isEmpty()){ email.setError("Email is required!"); email.requestFocus(); return; } if (!Patterns.EMAIL_ADDRESS.matcher(Email).matches()){ email.setError("Please enter a valid email!"); email.requestFocus(); return; } if(Password.isEmpty()){ password.setError("Password is required!"); password.requestFocus(); return; } if (Password.length() < 6){ password.setError("Min password length is 6 characters!"); password.requestFocus(); return; } progressBar.setVisibility(View.VISIBLE); mAuth.signInWithEmailAndPassword(Email,Password).addOnCompleteListener(new OnCompleteListener<AuthResult>() { @Override public void onComplete(@NonNull Task<AuthResult> task) { progressBar.setVisibility(View.INVISIBLE); if (task.isSuccessful()){ FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if(user.isEmailVerified()) { String uid = task.getResult().getUser().getUid(); FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance(); // 先判断是否为学生身份 firebaseDatabase.getReference("USER").child("Student").child(uid).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if(snapshot.exists()){ // 是学生,跳学生对应页面 startActivity(new Intent(Login.this, Example.class)); }else{ // 不是学生,判断是否为教师 firebaseDatabase.getReference("USER").child("Teacher").child(uid).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { if(snapshot.exists()){ // 是教师,跳教师对应页面 startActivity(new Intent(Login.this, MainActivity.class)); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } } @Override public void onCancelled(@NonNull DatabaseError error) { } }); } else{ user.sendEmailVerification(); Toast.makeText(Login.this, "Check your email to verify your account!", Toast.LENGTH_SHORT).show(); } }else{ Toast.makeText(Login.this, "Failed to Login! Please check your credentials", Toast.LENGTH_SHORT).show(); } } }); } }
注意事项
- 需确保你的实时数据库规则允许读取
USER/Student和USER/Teacher节点的权限,否则会读取失败 - 若学生和教师页面跳转对应关系和示例不一致,自行调整
Intent跳转的目标Activity即可
内容的提问来源于stack exchange,提问作者red daemon
相关产品推荐
相关产品推荐

